我们正在使用一个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
进程并未被终止或变为死进程。使用
subprocess.call()
函数并将'kill'
和pid
作为参数,即可发出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
命令只是向进程发送一个“信号”,要求其终止工作。但如果你使用-9
选项来kill
进程,它将被操作系统强制终止。然而,这被认为是一种不好的结束进程的方式。 - Willem Van Onsemkill -9
做的事情和subprocess.kill()
函数相同。无论我是尝试使用p.terminate()
干净地终止它还是使用p.kill()
杀死它,它最终都会成为僵尸进程。 - user7495615Popen.(['ffmpeg' etc...])
将本地主机的UDP数据保存到一个mp3
文件中。当通过IDE结束执行时,一切正常,但当我尝试通过代码本身使用Popen.terminate()
和Popen.wait()
来结束它时,文件大小为零。 - bomben