¿Por qué la suspensión, cuando se ejecuta en un script de shell, ignora SIGINT?

¿Por qué la suspensión, cuando se ejecuta en un script de shell, ignora SIGINT?

Cuando lo ejecuto sleepmanualmente y luego kill -INTlo 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, sleepignora 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 SIGINTcuando ejecuto sleepdentro de un script de shell?

Obtengo el mismo comportamiento con dashy bash. Mi kernel es Linux 5.4.0.

Respuesta1

Al /bin/sleep 10 &terminar, &el shell se ejecuta sleepde 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_IGNpersiste 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.

información relacionada