Affiner la dernière réponse, car elle a des problèmes:
# Our general exit handler
cleanup() {
err=$?
echo "Cleaning stuff up..."
trap '' EXIT INT TERM
exit $err
}
sig_cleanup() {
trap '' EXIT # some shells will call EXIT after the INT handler
false # sets $?
cleanup
}
trap cleanup EXIT
trap sig_cleanup INT QUIT TERM
Points ci-dessus:
Les gestionnaires INT et TERM ne s'arrêtent pas pour moi lorsque je teste - ils gèrent l'erreur, puis le shell retourne à la sortie (et ce n'est pas trop surprenant). Je m'assure donc que le nettoyage se termine par la suite et, dans le cas des signaux, utilise toujours un code d'erreur (et dans l'autre cas, une sortie normale conserve le code d'erreur).
Avec bash, il semble que quitter dans le gestionnaire INT appelle également le gestionnaire EXIT. C'est pourquoi je détache le gestionnaire de sortie et l'appelle moi-même (ce qui fonctionnera dans n'importe quel shell, quel que soit le comportement).
J'interromps l'exit parce que les scripts de shell peuvent se terminer avant qu'ils atteignent le bas - erreurs de syntaxe, set -e et un retour différent de zéro, appelant simplement l'exit. Vous ne pouvez pas compter sur un shellscript pour aller au fond.
SIGQUIT est Ctrl- \ si vous ne l'avez jamais essayé. Vous obtient un bonus coredump. Donc, je pense que cela vaut également la peine d'être piégé, même si c'est un peu obscur.
L’expérience passée montre que si vous (comme moi) appuyez toujours sur Ctrl-C à plusieurs reprises, vous l’accepterez parfois à mi-chemin de la partie nettoyage de votre script shell, donc cela fonctionne mais pas toujours aussi parfaitement que vous le souhaitez.
INT TERM EXIT
le code de nettoyage est exécuté deux fois quandSIGTERM
ouSIGINT
est reçu.