Windows等效于在Python 3中生成和杀死单独的进程组?

时间:2017-10-30 13:39:50

标签: python windows python-3.5

我有一个Web服务器,需要管理一个单独的多进程子进程(即启动并终止它)。

对于基于Unix的系统,以下工作正常:

# save the pid as `pid`
ps = subprocess.Popen(cmd, preexec_fn=os.setsid)

# elsewhere:
os.killpg(os.getpgid(pid), signal.SIGTERM)

我这样做(使用os.setsid),否则杀死进度组也会杀死Web服务器。

在Windows上,这些os函数不可用 - 所以如果我想在Windows上完成类似的操作,我该怎么做?

我正在使用Python 3.5。

1 个答案:

答案 0 :(得分:2)

此答案由eryksun作为注释提供。我将其放在此处以突出显示,因为有人可能还会涉及到这个问题

他在说什么:

  

您可以通过ps = subprocess.Popen(cmd,creationflags = subprocess.CREATE_NEW_PROCESS_GROUP)创建一个新的进程组。组ID是线索流程的流程ID。就是说,它仅对于树中与您的进程连接到同一控制台(conhost.exe实例)的进程有用,即使您的进程甚至具有控制台。在这种情况下,您可以通过ps.send_signal(signal.CTRL_BREAK_EVENT)向该组发送Ctrl + Break。进程不应忽略Ctrl + Break。他们应该优雅退出或让默认处理程序执行,该处理程序调用ExitProcess(STATUS_CONTROL_C_EXIT)

我对此进行了尝试并成功:

process = Popen(args=shlex.split(command), shell=shell, cwd=cwd, stdout=PIPE, stderr=PIPE,creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)
/*...*/
process .send_signal(signal.CTRL_BREAK_EVENT)
process .kill()