繁体   English   中英

Python外部进程未终止

[英]Python external process not terminating

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM