Ho uno script bash per l'esecuzione di un server, che in genere verrà terminato dall'utente usando Ctrl-C
. All'uscita esegue una funzione di pulizia, che non voglio venga interrotta da un secondo 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
...
Al momento, un secondo Ctrl-C
prima di scp
ha terminato fa sì che lo script si blocchi a tempo indeterminato. Capisco che questo ha qualcosa a che fare con il SIGINT
inviato sia allo script bash che a scp
processo, ma non sono sicuro del motivo per cui ciò causa il blocco dello script, anziché semplicemente causare il fallimento della pulizia.
Quindi la mia domanda è:
- Perché questo provoca il blocco dello script?
- Come posso impedire a SIGINT di raggiungere il
scp
essh
processi figlio?
Risposta accettata:
trap '' INT
ha lo scopo di ignorare i SIGINT per la shell e tutti i suoi figli.
Ma guardando strace
output su scp
, sembra scp
installa il proprio gestore SIGINT che annulla il SIG_IGN sopra.
L'unico modo per impedirgli di ottenere il SIGINT sarebbe eseguirlo in un gruppo di processi diverso come con:
perl -MPOSIX -e 'setpgid 0,0; exec @ARGV' scp...
o
(set -m; scp ... & wait)
oppure dì al driver tty di interrompere l'invio di SIGINT su Ctrl-C (come con stty -isig
o stty intr ''
per ^C
da solo), anche se vorresti ripristinare le impostazioni in seguito:
saved=$(stty -g)
stty intr ''
scp ...
stty "$saved"