script shell pour se reproduire processus, mettre fin à des enfants sur SIGTERM
-
13-09-2019 - |
Question
Je veux écrire un script shell qui génère plusieurs processus de longue durée en arrière-plan, puis rôde,. Après avoir reçu SIGTERM, je veux que tous les sous-processus de mettre fin ainsi.
En fait, je veux un "processus maître".
Voici ce que je suis arrivé à ce jour:
#!/bin/sh
sleep 600 &
PID1="$!"
sleep 600 &
PID2="$!"
# supposedly this should kill the child processes on SIGTERM.
trap "kill $PID1 $PID2" SIGTERM
wait
Le script ci-dessus échoue avec trap: 10: SIGTERM: bad trap
.
Edit: J'utilise Ubuntu 9.04
La solution 2
La réponse de Joe m'a mis sur la bonne voie. J'ai aussi découvert que je devrais piéger plusieurs signaux pour couvrir mes bases.
script final ressemble à ceci:
#!/bin/sh
sleep 600 &
PID1="$!"
sleep 600 &
PID2="$!"
trap "kill $PID1 $PID2" exit INT TERM
wait
Autres conseils
Cela fonctionne pour moi:
trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
-
kill -- -$$
envoie un SIGTERM pour l'ensemble du groupe de processus , tuant ainsi également les descendants. -
La spécification
EXIT
de signal est utile lorsque vous utilisezset -e
(plus de détails ).
Je soupçonne votre / bin / sh n'est pas un Bash (si vous avez marqué la question 'Bash').
Dans le message que je suppose que c'est un DASH. Consultez son manuel ou tout simplement fixer votre tralala si vous avez besoin d'écrire du code Bash.
Ce script semble correct et fonctionne pour moi comme prévu.
Comment envoyer le signal SIGTERM au « processus maître »?
Peut-être que vous devez exécuter kill -l
pour vérifier quels signaux sont pris en charge.
Comme le message d'erreur vous suggère d'envoyer le signal « 10 » qui votre système ne semble pas reconnaître.
Et la prochaine fois que vous devez ajouter le système d'exploitation, version shell, noyau, ... pour une telle question