2015-11-26 3 views
0

J'utilise MULTIPROCESSING pour trouver mes besoins. Et quand cela se passe je reçois un pid (peut-être parent, je ne sais pas comment appeler ça) alors co traite avec leur propre ID de pid et de référence du premier processus.kill processus et ses sous/co-processus en obtenant leur pid parent par script python

Maintenant, je dois tuer tous ces processus en tuant seulement le premier processus, ce qui sera la meilleure façon de le faire. CELA AUSSI DANS LA VOIE PYTHONIQUE.

Scénario est comme

ps -ef |grep py 

Je reçois

2222 0001 first.py #0001 is os process 
    4323 2222 second.py 
    4324 2222 third.cgi 
    4324 2222 fourth.py 
    4325 2222 fifth.cgi 
    4326 2222 sixth.py 

    2223 0001 newfirst.py ############new first process from another script started 
    4327 2223 newsecond.cgi 
    4328 2223 newthird.py 
    4329 2223 newfourth.cgi 

maintenant je suis en train de tuer processus par (quand un bouton d'arrêt est enfoncé)

kill -6 2222 ###from terminal 

alors seulement first.py est en train d'être tué et les co-processus restants en cours d'exécution. Bien sûr, je peux tuer d'autres processus du terminal, mais je veux le faire d'une manière plus pythonique (en exécutant un script qui se déclenchera quand quelqu'un appuie sur un bouton ARRET du formulaire conçu pour exécuter des fichiers .py)

Maintenant, comment puis-je tuer tous ces co-processus dès que je tue first.py (comme je ne veux plus que ses co fonctionnent) mais l'autre newfirst.py et ses co's ne devraient pas être dérangés.

ce que je viens jusqu'à est loin

import os 
pid = os.getpid() 
os.system('kill -9 ' + pid) 

alors comment filtrer les co-processus de ce premier numéro de processus 2222 et les tuer.

J'ai également essayé d'utiliser psutil, mais passer nom après nom à tuer n'est pas très convaincant.

J'ai vérifié la méthode subprocess.popen mais j'ai échoué et maintenant je suis hors de la logique, s'il vous plaît suggérer.

Si d'autres informations sont nécessaires, veuillez commenter.

+0

Pour supprimer un groupe de processus avec un signal 'os.killpg (pgid, sig)' peut être utilisé. Dans votre cas 'os.killpg (pid, 9)' – Kadir

Répondre

1

De votre question, je ne suis pas capable de comprendre; Cependant, je suppose que vous avez un identifiant de processus pratique, par ex. dans votre exemple, vous avez id processus 2222. Ensuite, vous pouvez essayer:

#Assuming you have parent_pid i.e. from your example you have 2222 
pname = psutil.Process(parent_pid) 
cpid = pname.get_children(recursive=True) 
for pid in cpid: 
    os.kill(pid.pid, signal_num) #signal_num is the signal you want to send i.e. 9 as per your example 

S'il vous plaît prendre en charge la gestion des exceptions par exemple vérifiez si le processus/processus-enfant existe avant de le tuer, etc., en utilisant le bloc try - except.