【发布时间】:2017-06-17 02:48:21
【问题描述】:
我们正在使用 python 进程来管理长时间运行的 python 子进程。有时需要杀死子进程。 kill 命令不会完全杀死进程,只会使其失效。
运行以下脚本演示了这种行为。
import subprocess
p = subprocess.Popen(['sleep', '400'], stdout=subprocess.PIPE, shell=False)
或
p = subprocess.Popen('sleep 400', stdout=subprocess.PIPE, shell=True)
将创建一个子进程。
p.terminate()
p.kill()
对进程没有任何作用。由ps aux | grep sleep演示
$ ps aux| grep 'sleep'
User 8062 0.0 0.0 7292 764 pts/7 S 14:53 0:00 sleep 400
该进程尚未被杀死/失效。使用带有'kill' 和pid 作为参数的subprocess.call() 函数将发出kill 命令。
subprocess.call(['kill', str(p.pid)])
这将终止进程,但它现在已失效。
$ ps aux | grep 'sleep'
User 8062 0.0 0.0 0 0 pts/7 Z+ 14:51 0:00 [sleep] <defunct>
如果队列运行的时间足够长,它最终会达到其最大进程数,还是最终会收获已失效的进程并且一切正常?
如果答案是前者,如何在不杀死父进程的情况下在 python 中处理已失效的进程?
有没有更好的杀死进程的方法?
【问题讨论】:
-
kill只向进程发送一个“信号”并要求它终止它的工作。但是,如果您使用-9kill它会被操作系统杀死。但这被认为是结束进程的不好方法。 -
kill -9与subprocess.kill()功能相同。无论我尝试用p.terminate()干净地终止它还是用p.kill()杀死它,它仍然最终成为僵尸进程。 -
我使用
Popen.(['ffmpeg' etc...])将来自本地主机的UDP 数据保存到mp3文件中。当我通过 IDE 结束执行时,一切正常,但是当我尝试使用Popen.terminate()和Popen.wait()通过代码本身结束它时,文件大小为zero。
标签: python linux zombie-process defunct