226 votes

tuer les processus d’arrière-plan lorsque la sortie de script shell

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.

211voto

Johannes Schaub - litb Points 256113

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.

197voto

tokland Points 29813

D’après mon expérience, c’est la solution la plus simple :

  • ``envoie un SIGTERM au groupe tout le processus, donc tuer aussi des descendants.
  • Signal indiquant est utile lorsque vous utilisez (plus de détails ici).

130voto

korkman Points 186

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.

21voto

raytraced Points 91
<blockquote> <p>Trap « kill $(emploi -p) » sortie</p> <p>J’ai serait apporter seulement des modifications mineures à la réponse de Johannes et emplois - pr permet de limiter la tuer au processus en cours et ajouter un peu plus des signaux à la liste :</p><pre><code></code></pre></blockquote>

11voto

tdaitx Points 73

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.com

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.

Powered by:

X