2008-11-20 6 views
7

Quelle est la meilleure façon de tuer un processus et tous ses processus enfants à partir d'un script Perl? Il devrait fonctionner au moins sous Linux et Solaris, et ne nécessite pas l'installation de paquets supplémentaires. Je devinerais obtenir une liste de tous les processus et de leurs parents en analysant les fichiers dans/proc ou en analysant la sortie de ps (qui ne semble pas portable entre Linux et Solaris); puis en tuant tous les processus dans l'arbre (qui semble sujet aux conditions de course).Comment est-ce que je peux tuer un arbre entier de processus avec Perl?

Je pourrais vivre avec les conditions de course dans ce cas particulier, mais comment puis-je obtenir la liste des processus?

Répondre

9

Si vous pouvez vivre avec le meurtre d'un groupe de processus, vous pouvez utiliser les éléments suivants:

kill -$signum, $pgid; 

$signum est le numéro de signal et $pgid est l'ID du groupe de processus. Cependant, le nombre de signaux ne sont pas très portable, auquel cas vous pouvez (sur certaines plates-formes, lire perlfunc pour explication) procédez comme suit (pour envoyer SIGTERM, par exemple):

kill 'TERM', -$pgid; 
+0

Quels processus appartiennent à un groupe de processus? J'utilise IPC :: Open3 pour démarrer un processus (qui sur Solaris exécute la commande à l'intérieur de sh -c), et je veux tuer le sh et ma commande actuelle et tous les autres sous-processus. Que faire si le groupe de processus contient même l'interpréteur Perl? Ça ne peut pas arriver? – oliver

+0

Tant que vous n'utilisez pas SIGKILL, vous pouvez faire en sorte que votre programme Perl ignore le signal que vous envoyez. Lire perlipc (recherche de "groupe de processus"). –

Questions connexes