Tengo un script bash, en el que ejecuto una línea, duermo durante algún tiempo y luego tail -f
mi archivo de registro para verificar que se ve un cierto patrón, presiono ctrl + c para salir tail -f
y luego pasar a la siguiente línea hasta que el script bash finalice la ejecución :
Esto es lo que he hecho hasta ahora:
#!/bin/bash
# capture the hostname
host_name=`hostname -f`
# method that runs tail -f on log_file.log and looks for pattern and passes control to next line on 'ctrl+c'
echo "==================================================="
echo "On $host_name: running some command"
some command here
echo "On $host_name: sleeping for 5s"
sleep 5
# Look for: "pattern" in log_file.log
# trap 'continue' SIGINT
trap 'continue' SIGINT
echo "On $host_name: post update looking for pattern"
tail -f /var/log/hadoop/datanode.log | egrep -i -e "receiving.*src.*dest.*"
# some more sanity check
echo "On $host_name: checking uptime on process, tasktracker and hbase-regionserver processes...."
sudo supervisorctl status process
# in the end, enable the balancer
# echo balance_switch true | hbase shell
El script funciona pero aparece el error, ¿qué necesita cambiar / qué estoy haciendo mal?
./script.sh: line 1: continue: only meaningful in a `for', `while', or `until' loop
Respuestas:
La
continue
palabra clave no significa lo que creas que significa. Significa continuar con la siguiente iteración de un bucle. No tiene sentido fuera de un bucle.Creo que estas buscando
Como no desea hacer nada al recibir la señal (más allá de matar el trabajo en primer plano), no coloque ningún código en la trampa. Necesita una cadena no vacía, porque la cadena vacía tiene un significado especial: hace que se ignore la señal.
fuente
trap : INT
El error surge debido a
trap 'continue' SIGINT
. Dehelp trap
:Por lo tanto, su script intenta ejecutar el
continue
comando cuando recibe laSIGINT
llamada, pero solocontinue
se usa en bucles.fuente