通过使用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块在终止前检查进程/子进程是否存在等。

相关文章