Tengo el siguiente script:
#!/bin/bash
echo "We are $$"
trap "echo HUP" SIGHUP
cat # wait indefinitely
Cuando envío SIGHUP
(usando kill -HUP pid
), no pasa nada.
Si cambio ligeramente el script:
#!/bin/bash
echo "We are $$"
trap "kill -- -$BASHPID" EXIT # add this
trap "echo HUP" SIGHUP
cat # wait indefinitely
... entonces el script hace echo HUP
lo correcto al salir (cuando presiono Ctrl + C):
roger@roger-pc:~ $ ./hupper.sh
We are 6233
^CHUP
¿Que esta pasando? ¿Cómo debo enviar una señal (no necesariamente tiene que ser SIGHUP
) a este script?
cat
finalice el proceso. Pruebe su secuencia de comandos original y presioneCtrl+D
para quecat
salga el proceso. Mientras elcat
proceso está en primer plano,HUP
no se actúa sobre la señal. Intente nuevamente concat
reemplazado porread
(un shell incorporado).while true; do read; done
al final, de lo contrario, ingresar texto hace que se cierre también, y quiero que se cierre en Ctrl + C.Respuestas:
El manual de Bash dice:
Eso significa que a pesar de que la señal se recibe
bash
cuando la envía, su trampa en SIGHUP solo se llamará cuandocat
finalice.Si este comportamiento no es deseable, use
bash
builtins (por ejemplo,read
+printf
en un bucle en lugar decat
) o use trabajos en segundo plano (consulte la respuesta de Stéphane ).fuente
@xhienne ya ha explicado por qué , pero si desea que la señal actúe de inmediato (y no salir del script), puede cambiar su código a:
El pequeño baile con los descriptores de archivo es evitar el hecho de que
bash
redirige stdin a los/dev/null
comandos iniciados en segundo plano.fuente