gpt4 book ai didi

python - 如何干净地杀死python中的子进程

转载 作者:IT王子 更新时间:2023-10-29 00:56:46 26 4
gpt4 key购买 nike

我们正在使用 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 中的已失效进程?

是否有更好的终止进程的方法?

最佳答案

这里有两个主要问题:

第一个问题:如果您正在使用 shell=True,那么您将终止运行进程的 shell,而不是进程本身。父进程被杀死后,子进程就会失效/不会立即被杀死。

在您的情况下,您使用的是非内置的 sleep,因此您可以删除 shell=TruePopen会产生实际的进程 ID:p.terminate() 会起作用。

大多数时候你可以(而且你应该)避免 shell=True,即使它需要额外的 python 编码工作(将 2 个命令连接在一起,重定向输入/输出,所有这些情况都可以由一个或多个 Popen without shell=True 很好地处理。

并且(第二个问题)如果在该修复后终止时进程仍然不存在,您可以调用 p.wait()(来自 this 问题)。似乎调用 terminate 是不够的。 Popen 对象需要进行垃圾回收。

关于python - 如何干净地杀死python中的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41961430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com