【问题标题】:Python: Killing children's children processPython:杀死孩子的孩子进程
【发布时间】:2016-08-22 03:06:19
【问题描述】:

我有一个进程调用:

p=multiprocessing.Process(target=func_a)

然后func_a启动一个子进程:

subprocess.Popen(["nc", "-l", "-p", str(dport)], stdout=open(os.devnull, "w"))

我的问题是当我打电话给p.terminate() 时,它只会杀死第一个孩子。 p.terminate()SIGKILL,所以当我将 p.terminate() 调用到 multiprocessing.Process 时,我怎么能让子进程死掉。

【问题讨论】:

  • 根据the docp.terminate()发送SIGTERM,而SIGKILLp.kill()发送

标签: python subprocess multiprocessing signals kill


【解决方案1】:

我找到了一种方法来确保子进程在多处理进程被杀死之前被杀死

像这样创建一个类:

import subprocess
import multiprocessing
import time
import os

class MyProcess(multiprocessing.Process):
    def __init__(self):
        super(MyProcess,self).__init__()
        self.q = multiprocessing.Queue()

    def run(self):
        # do something else
        child = subprocess.Popen(['Your CMD'])
        self.q.put(child.pid)

    def MyTerminate(self):
        pid = self.q.get()
        os.kill(pid, 9) # works in windows and linux
        # os.popen('taskkill.exe /pid '+str(pid)+' /F') # works only in windows
        self.terminate()

那么你就可以使用MyTerminate()函数来安全地杀死进程了。

例如:

def main():
    mp = MyProcess()
    mp.start()
    time.sleep(1)
    mp.MyTerminate()

子进程“child”将在 1 秒后被杀死。

【讨论】:

  • 啊不错!!我想过这个,但我不想给整个事情添加一个队列。如果子进程未能创建子进程然后没有任何东西排队,会发生什么?在调用MyTerminate 时,我们会阻止该程序,对吗?我们应该添加 1 秒的超时时间吗?
  • @edgarcosta - 当创建子进程失败时,您可以使用 try/except 将 False 放入队列,然后在 os.kill(pid,9) 之前使用 if pid:。其实我并不想用queue,但我们得想办法把pid传输到MyTerminate()。在我的测试中,成员变量在run() 中不起作用。所以 multiprocessing.Queue 是完成这项工作的有效方法。至于超时,我认为 main() 中的 time.sleep(1) 就像某种超时。
【解决方案2】:

使用 signal.signal 注册一个处理程序,如下所示:

#!/usr/bin/env python
import signal
import sys
def signal_handler(signal, frame):
        #iterate over your subprocess and kill them
        sys.exit(0)
signal.signal(signal."the signal", signal_handler)
print('Press Ctrl+C')
signal.pause()

更多关于信号的文档可以在here找到。

【讨论】:

  • 我认为 SIGKILL 不能被捕获:> 信号 SIGKILL 和 SIGSTOP 不能被捕获、阻止或忽略。
  • 你是对的,我的错我会用一个通用的信号处理程序来设置答案
猜你喜欢
  • 2012-02-25
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
相关资源
最近更新 更多