我有一个小的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进程是PID5984,python进程是3736。现在,我运行sleep 10000 &
,使它作为PID5984的子级运行。我检查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中,fork
和exec
的组合导致第二个bash进程被睡眠所取代。
Windows基于创建进程的派生模型,该模型是从DEC VMS继承而来的。(Dave Cutler负责VMS和NT的设计。1988年,许多DEC前工程师跟随他来到微软。)NT内核实际上可以实现fork
和exec
,这是SUA子系统的功能。