我们正在使用 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 中处理已失效的进程?
有没有更好的杀死进程的方法?