【问题标题】:Python psutil not showing all child processesPython psutil 未显示所有子进程
【发布时间】:2015-05-13 16:42:25
【问题描述】:

我有一个小的 python 脚本,基本上如下所示:

import os
import psutil

def processtree():
    pid = os.getpid()
    # have to go two levels up to skip calling shell and 
    # get to actual parent process
    parent = psutil.Process(pid).parent().parent()

    print 'Parent %s [PID = %d]' % (parent.name(), parent.pid)
    print '        |'
    for child in parent.children(recursive=True):
        if child.pid != pid:
            print '        - Child %s [PID = %d]' % (child.name(), child.pid)
        else:
            print '        - Child %s [PID = %d] (Self)' % (child.name(), child.pid)

if '__name__' == '__main__':
    processtree()

当我在 Windows 上以 bash 运行此脚本时,没有其他任何运行,我看到以下内容:

Parent bash.exe [PID = 5984]
       |
       - Child bash.exe [PID = 5008]
       |
       - Child python.exe [PID = 3736] (Self)

此信息是正确的。父 bash 进程是 PID 5984,python 进程是 3736。现在,我运行 sleep 10000 &,使其作为 PID 5984 的子进程运行。我检查 ps -aef | grep 5984,它就在那里;

$ ps -aef | grep 5984 | grep -v grep | grep -v ps
myuser    5984       1 con    May 12 /bin/bash
myuser    5080    5984 con  11:17:12 /bin/sleep
myuser    3948    5984 con  11:36:47 /bin/bash

但是,当我再次运行我的脚本时,它仍然显示:

Parent bash.exe [PID = 5984]
       |
       - Child bash.exe [PID = 7560]
       |
       - Child python.exe [PID = 5168] (Self)

它不会将 sleep 显示为父 bash 进程的子进程,即使 ps 将其显示为存在。

请注意,自从创建了新的调用 shell 后,bash.exe 子项的 PID 发生了变化(不知道为什么会发生这种情况,但我认为这不相关)。 python解释器的PID,因为我再次调用了脚本python processtree.py

不知道我做错了什么,我已经盯着这个看了一段时间。任何帮助表示赞赏...

【问题讨论】:

  • 其实我认为介入的bash 进程是问题所在。由于sleep 作为后台进程运行,它的直接父shell 可能已经退出。这让 psutil 无法构建树,因为在 Windows 中祖父进程 bashsleep 之间没有连接。 Windows 进程只记录其父进程的 ID,Windows 子系统服务器 (csrss.exe) 不维护 Unix 风格的进程树。另一方面,Cygwin 确实维护了一个进程树。
  • 哦,好的。在ps 中,当我看到祖父 bash shell 作为父 PID 时,我认为它是 sleep 的直接父进程。我会看看我是否可以在 Cygwin shell 或 Unix 机器上运行它。谢谢@eryksun。
  • 在 Unix 中,forkexec 的组合导致第二个 bash 进程被 sleep 替换。因此,您需要改用parent = psutil.Process(pid).parent()。 Windows 基于创建进程的衍生模型,这是继承自 DEC VMS 的传统。 (Dave Cutler 管理了 VMS 和 NT 的设计。许多前 DEC 工程师在 1988 年跟随他来到微软。)NT 内核实际上可以实现forkexec,它为SUA subsystem 实现了这一点。
  • @eryksun 就是这样。您会发表您的评论作为答案,以便我接受吗?非常感谢!

标签: python windows bash psutil


【解决方案1】:

从 cmets 发帖,以免其他人将此视为未回答的未解决问题

您需要改用parent = psutil.Process(pid).parent()

在 Unix 中,forkexec 的组合导致第二个 bash 进程被睡眠替换。

Windows 基于创建进程的衍生模型,这是继承自 DEC VMS 的传统。 (Dave Cutler 管理了 VMS 和 NT 的设计。许多前 DEC 工程师在 1988 年跟随他来到微软。)NT 内核实际上可以实现forkexec,它为SUA subsystem 实现了这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多