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? etsshprocessus 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"