我有一个处理请求的应用程序(使用2.7)。当收到类型“A”的请求时,我需要启动一个外部过程。
当收到类型为“B”的请求时,我需要检查并查看该外部进程是否已完成,然后根据它是否有用来做一些事情。
我遇到的问题是,当外部进程完成时不会退出,它会进入僵尸状态,例如:
1 Z root 13703 13644 0 80 0 - 0 exit 09:37 ? 00:00:00 [python] <defunct>
最初我和Popen一起开始了这个过程:
DEVNULL = open(os.devnull, "wb")
subprocess.Popen(cmd+args, stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL, close_fds=True)
我尝试使用os.spawn:
os.spawnv(os.P_NOWAIT, 'python', cmd+args)
但是这个过程仍未退出。
任何人都知道如何在完成后让外部进程终止?
答案 0 :(得分:4)
进程变为僵尸,直到其父进程收到它。您可以在https://unix.stackexchange.com/questions/105998/why-process-program-becomes-zombie
上阅读有关流程如何/为何成为僵尸的更多信息对于您的情况,您应该首先为创建的Popen()对象保留一个变量,然后您可以在该对象上调用poll()来检查它何时完成执行。一旦调用poll()并且该子进程完成执行(即达到僵尸状态),poll()将自动清理该子进程。
p = subprocess.Popen(cmd+args, stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL, close_fds=True)
收到请求B后,您可以
p.poll()
如果尚未完成,则会返回流程的返回代码或None
。
有关可以在Popen对象上调用的不同函数的更多信息:https://docs.python.org/2/library/subprocess.html#popen-objects