我的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)
发送终止信号吗?