Python psutil 未显示所有子进程
Python psutil not showing all child processes
我有一个小的 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
中 运行 这个脚本时,没有别的 运行ning,我看到以下内容:
Parent bash.exe [PID = 5984]
|
- Child bash.exe [PID = 5008]
|
- Child python.exe [PID = 3736] (Self)
此信息正确。父bash进程是PID 5984,python进程是3736。现在,我运行sleep 10000 &
所以它是运行ning的子进程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
显示它存在。
请注意,bash.exe 子项的 PID 自创建新呼叫 shell 以来已更改(不确定为什么会发生这种情况,但我认为这不相关)。 python解释器的PID因为我又调用了脚本python processtree.py
.
不确定我做错了什么,我已经盯着这个看了一段时间了。感谢任何帮助...
从评论中发帖,这样其他人就不会将其视为未回答的未解决问题
您需要改为使用 parent = psutil.Process(pid).parent()
。
在 Unix 中,fork
和 exec
的组合导致第二个 bash 进程被睡眠取代。
Windows基于创建进程的spawn模型,这是继承自DEC VMS的遗留问题。 (Dave Cutler 管理了 VMS 和 NT 的设计。许多前 DEC 工程师在 1988 年跟随他加入了 Microsoft。)NT 内核实际上可以实现 fork
和 exec
,它为 SUA subsystem.
我有一个小的 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
中 运行 这个脚本时,没有别的 运行ning,我看到以下内容:
Parent bash.exe [PID = 5984]
|
- Child bash.exe [PID = 5008]
|
- Child python.exe [PID = 3736] (Self)
此信息正确。父bash进程是PID 5984,python进程是3736。现在,我运行sleep 10000 &
所以它是运行ning的子进程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
显示它存在。
请注意,bash.exe 子项的 PID 自创建新呼叫 shell 以来已更改(不确定为什么会发生这种情况,但我认为这不相关)。 python解释器的PID因为我又调用了脚本python processtree.py
.
不确定我做错了什么,我已经盯着这个看了一段时间了。感谢任何帮助...
从评论中发帖,这样其他人就不会将其视为未回答的未解决问题
您需要改为使用 parent = psutil.Process(pid).parent()
。
在 Unix 中,fork
和 exec
的组合导致第二个 bash 进程被睡眠取代。
Windows基于创建进程的spawn模型,这是继承自DEC VMS的遗留问题。 (Dave Cutler 管理了 VMS 和 NT 的设计。许多前 DEC 工程师在 1988 年跟随他加入了 Microsoft。)NT 内核实际上可以实现 fork
和 exec
,它为 SUA subsystem.