我有一个处理请求的应用程序(使用 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)
但这个过程仍然没有退出。
有人知道我如何在完成后终止外部进程吗?
一个进程变成僵尸,直到它的父进程收获它。您可以在 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