【发布时间】:2011-03-10 21:04:57
【问题描述】:
我正在使用启动各种子进程的第三方库。当出现异常时,我想杀死所有子进程。如何获取子 pid 的列表?
【问题讨论】:
-
可能有助于告诉我们您的操作系统,因为这将取决于平台
-
POSIX 对您有帮助吗?我想有些人也想知道 Windows 的答案。
标签: python subprocess
我正在使用启动各种子进程的第三方库。当出现异常时,我想杀死所有子进程。如何获取子 pid 的列表?
【问题讨论】:
标签: python subprocess
听起来psutil 是推荐的方法。但是,如果您不想依赖外部库,则可以使用 ps 命令的 --ppid 按父 ID 过滤进程。 (当然,假设您在带有ps 的操作系统上运行。)
这是一个显示如何调用它的 sn-p:
ps_output = run(['ps', '-opid', '--no-headers', '--ppid', str(os.getpid())],
stdout=PIPE, encoding='utf8')
child_process_ids = [int(line) for line in ps_output.stdout.splitlines()]
【讨论】:
使用 psutil 可以让所有子进程(甚至递归进程)查看https://psutil.readthedocs.io/en/latest/#psutil.Process.children
【讨论】:
您不能总是在创建所有子流程时记录它们,因为它们会反过来创建您不知道的新流程。但是,使用 psutil 查找它们非常简单:
import psutil
current_process = psutil.Process()
children = current_process.children(recursive=True)
for child in children:
print('Child pid is {}'.format(child.pid))
【讨论】:
在创建子进程时记录所有子进程的 pid 通常更安全。没有一种符合 posix 标准的方式来列出子 PID。我知道这可以用 PS 工具来完成。
【讨论】:
psutil.Process 给我递归memory_info 和cpu_percent 但我对子进程的调用实际上打开了其他子进程(至少4 或5 个级别)我无法跟踪所有 PID。