2010-04-16 4 views
4

Je travaille sur un script shell Bash qui exécute plusieurs scripts Python comme ceci:Arrêter l'exécution du script python quand script shell Bash parent est tué

cd ${SCRIPT_PATH} 
python -u ${SCRIPT_NAME} ${SCRIPT_ARGS} >> $JOBLOG 2>&1 

À un moment donné, j'ai tué le script shell (en utilisant kill PID), mais le script Python a continué à s'exécuter, même après la fin du script. Je pensais que ceux-ci mourraient dès que le scénario principal serait mort. Qu'est-ce que je ne comprends pas au sujet des scripts Bash, et que puis-je faire pour obtenir la fonctionnalité que je recherche? Merci d'avance!

Répondre

2

Vous devez installer un gestionnaire de signal prendre soin de vos processus enfants:

trap "echo killing childs; pkill -P $$" EXIT 
+0

On dirait que ça va le faire, même si je pense que vous avez besoin de piéger plus que juste EXIT. – jrdioko

+0

Et une 'sortie' à la fin des commandes de piège, de sorte que le script lui-même mourra aussi. – jrdioko

+0

Et cela ne fonctionnera même pas ... puisque les arguments d'interruption ne seront pas exécutés avant la fin de la ligne en cours, et c'est la ligne en cours que je veux terminer. – jrdioko

1

Les enfants doivent être envoyés SIGHUP lorsque le processus parent meurt - cependant:

a) Le processus enfant peut ignorer SIGHUP, ou de le manipuler d'une manière non fatale. B) L'enfant peut se dissocier du processus parent avec fork() et devenir un chef de groupe de processus.

Vous pouvez juste exec le code python, de sorte que le shell est remplacé par le python.

+0

Je vois, merci! Je pense que (a) est le problème dans mon cas (probablement une clause "sauf"). – jrdioko