gpt4 book ai didi

Python psutil 不显示所有子进程

转载 作者:可可西里 更新时间:2023-11-01 09:24:06 24 4
gpt4 key购买 nike

我有一个小的 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.

不确定我做错了什么,我已经盯着这个看了一段时间了。感谢任何帮助...

最佳答案

从评论中发帖,这样其他人就不会将其视为未回答的开放性问题

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

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

Windows 基于创建进程的生成模型,这是从 DEC VMS 继承下来的遗产。 (Dave Cutler 管理了 VMS 和 NT 的设计。许多前 DEC 工程师在 1988 年跟随他到 Microsoft。)NT 内核实际上可以实现 forkexec,它为 SUA subsystem 所做的.

关于Python psutil 不显示所有子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30220732/

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