Tengo una secuencia de comandos bash para ejecutar un servidor, que normalmente el usuario terminará usando Ctrl-C
. Al salir, ejecuta una función de limpieza, que no quiero que sea interrumpida por un segundo Ctrl-C
.
#!/bin/bash
...
function cleanup {
trap '' INT
echo -n " Cleaning up..."
scp $SRV:~/$DIR/server.log . && ssh -t $SRV "rm -rf ~/$DIR"
echo " Finished."
exit 0
}
trap cleanup EXIT
...
Por el momento, un segundo Ctrl-C
antes del scp
ha finalizado hace que el script se cuelgue indefinidamente. Entiendo que esto tiene algo que ver con el SIGINT
siendo enviado tanto al script bash como al scp
proceso, pero no sé por qué esto hace que la secuencia de comandos se cuelgue, en lugar de simplemente hacer que falle la limpieza.
Entonces mi pregunta es:
- ¿Por qué esto hace que el script se cuelgue?
- ¿Cómo puedo evitar que SIGINT llegue al
scp
? yssh
procesos secundarios?
Respuesta aceptada:
trap '' INT
está destinado a ignorar los SIGINT para el shell y todos sus hijos.
Pero mirando strace
salidas en scp
, parece scp
instala su propio controlador SIGINT que cancela el SIG_IGN anterior.
La única forma de evitar que obtenga el SIGINT sería ejecutarlo en un grupo de procesos diferente como con:
perl -MPOSIX -e 'setpgid 0,0; exec @ARGV' scp...
o
(set -m; scp ... & wait)
o dígale al controlador tty que deje de enviar SIGINT sobre Ctrl-C (como con stty -isig
, o stty intr ''
para ^C
solo), aunque querrá restaurar la configuración después:
saved=$(stty -g)
stty intr ''
scp ...
stty "$saved"