kill process and its sub/co-processes by getting their parent pid by python script

狂风中的少年 提交于 2020-01-07 03:10:58

问题


i am using MULTIPROCESSING to find my requirement. And when that runs i am getting a pid(may be parent! i don't know what to call that) then co processes with their own pid and reference id of first process.

Now i need to kill all those processes BY ONLY KILLING THE FIRST PROCESS then which will be the best way to do that. THAT ALSO IN PYTHONIC WAY.

Scenario is like

  ps -ef |grep py

i am getting

  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

now i am killing process by (when a stop button is pressed)

 kill -6 2222   ###from terminal

then only first.py is getting killed and the remaining co-processes still running. Of course i can kill other processes from terminal,,but i want to do it in a more pythonic way(by running a script which will trigger when someone press a STOP button form front-end designed to run .py files )

Now how can i kill all those co-process as soon as i kill first.py (as i don't want its co's to run anymore) but the other newfirst.py and its co's should not get disturbed.

what i come up to is this far

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

so how to filter out co-processes from that first process id 2222 and kill them.

i have also tried using psutil,but passing name after name to kill is not very convincing.

I have checked subprocess.popen method but failed and now i am out of logic,please suggest.

If any other info is needed,please do comment.


回答1:


From your question, I am not able to understand; however I am assuming that you have process id handy e.g. in your example, you have process id 2222. Then you can try this:

#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

Please take care of exception handling e.g. check if process/child-process exist before you kill it etc using try - except block.



来源:https://stackoverflow.com/questions/33932160/kill-process-and-its-sub-co-processes-by-getting-their-parent-pid-by-python-scri

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!