当实际的父进程在子进程中被杀死时,python杀死子进程组

时间:2018-08-10 09:09:41

标签: python subprocess

我的python脚本将通过subprocess.Popen调用另一个脚本,并且该脚本调用另一个脚本,依此类推。因此,总共有6个进程被一个接一个地创建,这将是下面的进程树。

- Actual script process 
|- Child process of above process 
 |- Child process of above child process 
  |- Child process of above grandchild process 
   |- child process of the above grandgrand child process 

当我将proc.communicate(timeout=timeout_sec)与超时一起使用时,该程序将引发subprocess.TimeoutExpired异常,并且不会终止该进程。因此,我必须捕获异常,然后使用proc.kill()终止进程。但是同样,当我尝试杀死进程时,它并没有杀死整个进程树。因此,我发现有一个start_new_session=True选项可以像单独组一样启动子流程,然后使用os.killpg(proc.pid, signal.SIGTERM)杀死整个流程树。

这是最终的代码,

proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, start_new_session=True)
try:
    stdout, stderr = proc.communicate(timeout=timeout_sec)
except subprocess.TimeoutExpired:
    os.killpg(proc.pid, signal.SIGTERM)

以上代码可以正常工作,并且可以杀死整个进程树。但是现在的问题是,当有人杀死了实际的脚本(the parent of newly created process group by subprocess)时,子进程start_new_session创建的进程组并没有被杀死。有什么方法可以从父进程向进程组(which created by subprocess)发送终止信号吗?

0 个答案:

没有答案