我正在为一些我用Popen启动的进程而挣扎,这些进程启动了子进程。当我在终端中手动启动这些进程时,如果发送CTRL+C,每个进程都会按预期终止子流程.Popen任何终止进程的尝试都只会删除父进程,而不会删除其子进程。在
我尝试了.terminate()..kill()以及..send_signal()信号。信号中断, signal.SIGTERM信号,但在任何情况下我都会终止父进程。在
通过这个父进程,我可以重现错误行为:#!/usr/bin/python
import time
import sys
import os
import subprocess
import signal
if __name__ == "__main__":
print os.getpid(), "MAIN: start a process.."
p = subprocess.Popen([sys.executable, 'process_to_shutdown.py'])
print os.getpid(), "MAIN: started process", p.pid
time.sleep(2)
print os.getpid(), "MAIN: kill the process"
# these just terminate the parent:
#p.terminate()
#p.kill()
#os.kill(p.pid, signal.SIGINT)
#os.kill(p.pid, signal.SIGTERM)
os.kill(p.pid, signal.SIGABRT)
p.wait()
print os.getpid(), "MAIN: job done - ciao"
现实生活中的儿童过程是管理.py从Django生成一些子进程并等待CRTL-C。但是下面的示例似乎也可以工作:
^{pr2}$
因此,我的问题是:如何在第一个示例中杀死进程,并同时删除子进程?在windows上os.杀死(p.pid,signal.CTRL\u\u事件)在某些情况下似乎是有效的,但是正确的方法是什么?终端是怎么做到的呢?在