En Ctrl + C, elimine el comando actual pero continúe ejecutando el script

10

Tengo un script bash, en el que ejecuto una línea, duermo durante algún tiempo y luego tail -fmi archivo de registro para verificar que se ve un cierto patrón, presiono ctrl + c para salir tail -fy 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
cog_n1t1v3
fuente
también potencialmente relevante para los visitantes de esta página: unix.stackexchange.com/questions/163561/…
pestophagous

Respuestas:

10

La continuepalabra 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

trap ' ' INT

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.

Gilles 'SO- deja de ser malvado'
fuente
1
O bientrap : INT
Stéphane Chazelas
1

El error surge debido a trap 'continue' SIGINT. De help trap:

ARG es un comando para leer y ejecutar cuando el shell recibe la (s) señal (es) SIGNAL_SPEC

Por lo tanto, su script intenta ejecutar el continuecomando cuando recibe la SIGINTllamada, pero solo continuese usa en bucles.

Costas
fuente