我们使用python进程来管理长时间运行的python子进程.偶尔需要杀死子程序.kill命令不会完全终止进程,只会使其失效.
运行以下脚本演示了此行为.
import subprocess
p = subprocess.Popen(['sleep', '400'], stdout=subprocess.PIPE, shell=False)
Run Code Online (Sandbox Code Playgroud)
要么
p = subprocess.Popen('sleep 400', stdout=subprocess.PIPE, shell=True)
Run Code Online (Sandbox Code Playgroud)
将创建一个子进程.
p.terminate()
p.kill()
Run Code Online (Sandbox Code Playgroud)
对这个过程没有任何作用.由...证明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
Run Code Online (Sandbox Code Playgroud)
这个过程没有被杀死/被解散.使用subprocess.call()带有'kill'和pid作为参数的函数将发出kill命令.
subprocess.call(['kill', str(p.pid)])
Run Code Online (Sandbox Code Playgroud)
这会杀死这个过程,但它现在已经不存在了.
$ ps aux | grep 'sleep'
User 8062 0.0 0.0 0 0 pts/7 Z+ 14:51 0:00 [sleep] <defunct>
Run Code Online (Sandbox Code Playgroud)
如果队列运行的时间足够长,它最终会达到最大进程数,还是最终会收到已解散的进程并且没问题呢?
如果答案是前者,我如何在不杀死父进程的情况下处理python中的defunct进程?
有没有更好的杀死进程的方法?