通过使用python脚本获取其父进程的ID来终止进程及其子进程/协进程
问题描述
我正在使用多处理来查找我的需求。 当它运行时,我得到了一个PID(可能是父母!我不知道该怎么称呼它),然后使用它们自己的进程ID和第一个进程的引用ID联合进程。
现在我需要通过只终止第一个进程来终止所有这些进程,这将是最好的方法。这也是一种毕德式的方式。
场景类似
ps -ef |grep py
我收到了
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
现在我正在通过(按下停止按钮时)终止进程
kill -6 2222 ###from terminal
然后,只有first.py被终止,其余的协同进程仍在运行。当然,我可以从终端终止其他进程,但我想要以一种更为典型的方式(通过运行一个脚本,该脚本将在前端设计用于运行.py文件的窗体按下停止按钮时触发)
现在,我如何在终止First.py之后立即终止所有这些协同进程(因为我不希望其co再运行),但其他newfirst.py及其co不应受到干扰。
我想到的就是这么远
import os
pid = os.getpid()
os.system('kill -9 ' + pid)
那么如何从第一个进程ID 2222中筛选出协进程并终止它们。
我也试过使用psutil,但一个接一个地传递杀死的名字不是很有说服力。
我已经检查了subcess.open方法,但失败了,现在我没有逻辑了,请建议。
如果需要任何其他信息,请发表意见。
解决方案
从您的问题中,我无法理解;但是,我假设您手头上有进程ID,例如,在您的示例中,您的进程ID为2222。然后您可以尝试此操作:
#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
请注意异常处理,例如使用try - except
块在终止前检查进程/子进程是否存在等。
相关文章