У меня есть небольшой питон скрипт, который по существу выглядит следующим образом:Python psutil не показывает все дочерние процессы
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()
Когда я запускаю этот скрипт в bash
на Windows, с ничего не работает, я вижу следующее :
Parent bash.exe [PID = 5984]
|
- Child bash.exe [PID = 5008]
|
- Child python.exe [PID = 3736] (Self)
Данная информация верна. Процесс Баш родитель PID 5984, и процесс питон 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
как ребенок процесса Баша родителя, даже если ps
показывает его как настоящее.
Обратите внимание, что PID для ребенка bash.exe изменился с момента создания новой оболочки вызова (не знаю, почему это происходит, но я не думаю, что это связано). PID интерпретатора python, потому что я снова вызвал скрипт python processtree.py
.
Не уверен, что я делаю неправильно, и я смотрел на это некоторое время. Любая помощь приветствуется ...
На самом деле, я думаю, что вмешательство «bash» является проблемой. Поскольку 'sleep' запускался как фоновый процесс, его ближайшая родительская оболочка, вероятно, вышла. Это не оставляет возможности для psutil для создания дерева, потому что в Windows нет связи между процессом grandpent 'bash' и' sleep'. Процесс Windows регистрирует только идентификатор своего родителя, а сервер подсистемы Windows ('csrss.exe') не поддерживает дерево процессов в стиле Unix. С другой стороны, Cygwin поддерживает дерево процессов. – eryksun
О, хорошо. В 'ps', когда я увидел оболочку bash grandparent bash как родительский PID, я понял, что это прямой родительский процесс сна. Я посмотрю, могу ли я запустить его в оболочке Cygwin или на машине Unix. Спасибо @eryksun. – Sagar
В Unix комбинация 'fork' и' exec' заставляет второй процесс 'bash' заменяться на' sleep'. Таким образом, вам нужно вместо этого использовать 'parent = psutil.Process (pid) .parent()'. Windows основана на модели появления новых процессов, которая является наследием, унаследованным от DEC VMS. (Дэйв Катлер управлял дизайном как VMS, так и NT. Многие из бывших инженеров DEC последовали за ним в Microsoft в 1988 году.) Ядро NT фактически может реализовать 'fork' и' exec', что делает это для подсистемы SUA [ https://technet.microsoft.com/en-us/library/cc772343.aspx). – eryksun