J'ai un script bash pour exécuter un serveur, qui sera généralement terminé par l'utilisateur à l'aide de Ctrl-C
. À la sortie, il exécute une fonction de nettoyage, que je ne veux pas être interrompue par un second 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
...
Pour le moment, un deuxième Ctrl-C
avant le scp
est terminé, le script se bloque indéfiniment. Je comprends que cela a quelque chose à voir avec le SIGINT
étant envoyé à la fois au script bash et au scp
processus, mais je ne comprends pas pourquoi cela provoque le blocage du script, plutôt que de simplement provoquer l'échec du nettoyage.
Donc ma question est :
- Pourquoi cela provoque-t-il le blocage du script ?
- Comment puis-je empêcher le SIGINT d'atteindre le
scp
? etssh
processus fils ?
Réponse acceptée :
trap '' INT
est censé ignorer les SIGINT pour le shell et tous ses enfants.
Mais en regardant strace
sorties sur scp
, il ressemble à scp
installe son propre gestionnaire SIGINT qui annule le SIG_IGN ci-dessus.
La seule façon de l'empêcher d'obtenir le SIGINT serait de l'exécuter dans un groupe de processus différent comme avec :
perl -MPOSIX -e 'setpgid 0,0; exec @ARGV' scp...
ou
(set -m; scp ... & wait)
ou dites au pilote tty d'arrêter d'envoyer SIGINT sur Ctrl-C (comme avec stty -isig
, ou stty intr ''
pour ^C
seul), bien que vous souhaitiez restaurer les paramètres par la suite :
saved=$(stty -g)
stty intr ''
scp ...
stty "$saved"