Python:杀死孩子的孩子过程

时间:2016-08-22 03:06:20

标签: python subprocess multiprocessing signals kill

我有一个调用的过程:

           account 1                 account 2 ...            account n
category 2     5        category  1       15       category 1     22
         m     3        category  3        3       category 2      3
                        category 10       10       category m     15

然后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()时,如何让子流程死亡。

2 个答案:

答案 0 :(得分:1)

使用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

答案 1 :(得分: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()

子过程“孩子”将在1秒后被杀死。