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

Était-ce utile?

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 utilisez set -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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top