我有一个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。
答案 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()