【问题标题】:kill process and its sub/co-processes by getting their parent pid by python script通过 python 脚本获取父 pid 来杀死进程及其子/协同进程
【发布时间】:2016-02-29 04:00:24
【问题描述】:

我正在使用 MULTIPROCESSING 来查找我的要求。 当它运行时,我得到一个 pid(可能是父进程!我不知道该怎么称呼它)然后与他们自己的 pid 和第一个进程的引用 id 共同处理。

现在我需要通过仅杀死第一个进程来杀死所有这些进程,这将是最好的方法。这也是 Python 的方式。

场景是这样的

  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 被杀死,其余的协同进程仍在运行。当然,我可以从终端杀死其他进程,但我想以一种更 Python 的方式来完成它(通过运行一个脚本,当有人按下一个 STOP 按钮时,该脚本将触发前端设计为运行 .py 文件)

现在我如何在我杀死 first.py 后立即杀死所有这些协同进程(因为我不希望它的 co 再运行)但另一个 newfirst.py 及其 co 不应该受到干扰。

我想不到这么远

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

那么如何从第一个进程 id 2222 中过滤掉协同进程并杀死它们。

我也尝试过使用 psutil,但是一个接一个地传递名字来杀死并不是很有说服力。

我检查了 subprocess.popen 方法但失败了,现在我逻辑不通,请建议。

如果需要任何其他信息,请发表评论。

【问题讨论】:

  • 可以使用os.killpg(pgid, sig) 信号杀死进程组。在你的情况下os.killpg(pid, 9)

标签: python python-multiprocessing kill-process


【解决方案1】:

从你的问题,我无法理解;但是我假设您有方便的进程 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 块在杀死它之前检查进程/子进程是否存在。

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 2016-03-23
    • 2021-11-29
    • 2020-03-02
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多