Cuando lo ejecuto sleep
manualmente y luego kill -INT
lo ejecuto, el modo de suspensión sale inmediatamente. Por ejemplo:
$ /bin/sleep 60 &
[1] 4002356
$ kill -INT 4002356
[1]+ Interrupt /bin/sleep 60
$ ps -C sleep
PID TTY TIME CMD
$
Sin embargo, cuando hago lo mismo en un script de shell, sleep
ignora el archivo SIGINT
. Por ejemplo:
set -o xtrace
echo
/bin/sleep 10 &
child="$!"
/bin/sleep 0.1
ps -C sleep
kill -TERM "$child" # SIGTERM
/bin/sleep 0.1
ps -C sleep
wait "$child" # will return immediately
echo
/bin/sleep 10 &
child="$!"
/bin/sleep 0.1
ps -C sleep
kill -INT "$child" # SIGINT
/bin/sleep 0.1
ps -C sleep
wait "$child" # will wait for 9.8 seconds
¿Por qué/cómo se ignora el sueño SIGINT
cuando ejecuto sleep
dentro de un script de shell?
Obtengo el mismo comportamiento con dash
y bash
. Mi kernel es Linux 5.4.0.
Respuesta1
Al /bin/sleep 10 &
terminar, &
el shell se ejecuta sleep
de forma asincrónica. El control de trabajos está deshabilitado de forma predeterminada en un script. En Bash se aplica lo siguiente [el énfasis es mío]:
Los comandos no integrados iniciados por Bash tienen controladores de señales configurados con los valores heredados por el shell de su padre.Cuando el control del trabajo no está vigente, los comandos asincrónicos ignoran SIGINTy SIGQUIT además de estos controladores heredados.
Fuente:Manual de referencia de bash.
Y, de manera relacionada, SIG_IGN
persiste durante una llamada a execv()
, con la posible excepción de SIGCHLD
.
Las señales configuradas para la acción predeterminada (SIG_DFL) en la imagen del proceso de llamada se configurarán para la acción predeterminada en la nueva imagen del proceso. Excepto SIGCHLD, las señales configuradas para ser ignoradas (SIG_IGN) por la imagen del proceso que llama se configurarán para que la nueva imagen del proceso las ignore. Las señales configuradas para ser captadas por la imagen del proceso de llamada se configurarán en la acción predeterminada en la nueva imagen del proceso (consulte <signal.h>).
Fuente:Especificaciones básicas de Open Group Número 7, edición 2018.