[英]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.