Python外部进程没有终止

时间:2017-04-12 14:45:55

标签: python python-2.7

我有一个处理请求的应用程序(使用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)

但是这个过程仍未退出。

任何人都知道如何在完成后让外部进程终止?

1 个答案:

答案 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