Python 外部进程未终止



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

最新更新