【问题标题】:How do you list all child processes in python?你如何列出python中的所有子进程?
【发布时间】:2011-03-10 21:04:57
【问题描述】:

我正在使用启动各种子进程的第三方库。当出现异常时,我想杀死所有子进程。如何获取子 pid 的列表?

【问题讨论】:

  • 可能有助于告诉我们您的操作系统,因为这将取决于平台
  • POSIX 对您有帮助吗?我想有些人也想知道 Windows 的答案。

标签: python subprocess


【解决方案1】:

听起来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()]

【讨论】:

    【解决方案2】:

    使用 psutil 可以让所有子进程(甚至递归进程)查看https://psutil.readthedocs.io/en/latest/#psutil.Process.children

    【讨论】:

      【解决方案3】:

      您不能总是在创建所有子流程时记录它们,因为它们会反过来创建您不知道的新流程。但是,使用 psutil 查找它们非常简单:

      import psutil
      
      current_process = psutil.Process()
      children = current_process.children(recursive=True)
      for child in children:
          print('Child pid is {}'.format(child.pid))
      

      【讨论】:

        【解决方案4】:

        在创建子进程时记录所有子进程的 pid 通常更安全。没有一种符合 posix 标准的方式来列出子 PID。我知道这可以用 PS 工具来完成。

        【讨论】:

        • 是的,我预料到了。问题是创建流程的不是我,而是第三方库。那好吧。这不是一个炫耀。
        • 其实你的答案不是解决方案。我真的需要知道如何让psutil.Process 给我递归memory_infocpu_percent 但我对子进程的调用实际上打开了其他子进程(至少4 或5 个级别)我无法跟踪所有 PID。
        • 这给了我们更多信息:stackoverflow.com/questions/3332043/…
        • Natim,你的问题与这个问题无关。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 2011-07-30
        • 1970-01-01
        • 2013-05-03
        • 2020-11-03
        相关资源
        最近更新 更多