Je suis à la recherche d’un moyen de nettoyer le gâchis lorsque mon script de niveau supérieur s’arrête.
Surtout si je veux utiliser `` , je souhaite que le processus d’arrière-plan mourrait lorsque le script s’arrête.
Je suis à la recherche d’un moyen de nettoyer le gâchis lorsque mon script de niveau supérieur s’arrête.
Surtout si je veux utiliser `` , je souhaite que le processus d’arrière-plan mourrait lorsque le script s’arrête.
Pour nettoyer quelques dégâts, trap
peut être utilisé. Il peut vous fournir une liste de choses exécutée quand un signal arrive:
trap "echo hello" SIGINT
mais il peut également être utilisé pour exécuter quelque chose si le shell sorties:
trap "killall background" EXIT
C'est un builtin, alors help trap
va vous donner des informations (fonctionne avec bash). Si vous ne voulez tuer les tâches en arrière-plan, vous pouvez le faire
trap 'kill $(jobs -p)' EXIT
Attention à usage unique, '
, pour éviter que le shell de substitution de l' $()
immédiatement.
Ma version :
Pourquoi convertir INT et à terme de sortir ? Parce que tous deux devraient déclencher la tuer 0 sans entrer dans une boucle infinie. Pourquoi déclencher kill 0 sur sortie ? Parce que l’écriture standard sorties devraient déclencher tuer 0, aussi. Pourquoi tuer 0 ? Parce que les sous-couches imbriquées doivent être tués ainsi. Cela va prendre vers le bas de l’arbre de l’ensemble du processus.
Pour être sur le côté sûr, j'ai trouver de mieux pour définir une fonction de nettoyage et de l'appeler à partir de piège:
cleanup() {
local pids=$(jobs -pr)
[ -n "$pids" ] && kill $pids
}
trap "cleanup" INT QUIT TERM EXIT [...]
ou en évitant la fonction tout à fait:
trap '[ -n "$(jobs -pr)" ] && kill $(jobs -pr)' INT QUIT TERM EXIT [...]
Pourquoi? Parce que tout simplement par l' trap 'kill $(jobs -pr)' [...]
on suppose qu'il va être en travaux en arrière-plan en cours d'exécution lorsque le piège condition est signalée. Quand il n'y a pas d'emplois, on va voir la suite (ou similaire) message:
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
parce qu' jobs -pr
est vide - je terminé que 'piège' (pun intended).
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.