Python psutil不显示所有子进程

2024-10-03 21:34:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个小的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中运行此脚本时,我看到以下内容:

^{pr2}$

这个信息是正确的。父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进程的子进程,即使{}将其显示为present。在

注意bash.exe自从创建了一个新的调用shell以来,child已经改变了(不确定为什么会发生这种情况,但我不认为这与此相关)。python解释器的PID,因为我再次调用了脚本python processtree.py。在

我不知道我做错了什么,我已经盯着这个有一段时间了。感谢任何帮助。。。在


Tags: toname脚本bashchild进程sleeppid
1条回答
网友
1楼 · 发布于 2024-10-03 21:34:19

发表评论,以便其他人不认为这是一个未回答的开放性问题

您需要使用parent = psutil.Process(pid).parent()。在

在Unix中,forkexec的组合导致第二个bash进程被sleep取代。在

Windows基于创建进程的spawn模型,这是从DEC VMS继承的一个遗产。(Dave Cutler管理VMS和NT的设计。很多DEC的工程师在1988年跟随他来到了微软。)NT内核实际上可以实现fork和{},这是为SUA subsystem实现的。在

相关问题 更多 >