2015-05-13 5 views
3

У меня есть небольшой питон скрипт, который по существу выглядит следующим образом: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.

Не уверен, что я делаю неправильно, и я смотрел на это некоторое время. Любая помощь приветствуется ...

+0

На самом деле, я думаю, что вмешательство «bash» является проблемой. Поскольку 'sleep' запускался как фоновый процесс, его ближайшая родительская оболочка, вероятно, вышла. Это не оставляет возможности для psutil для создания дерева, потому что в Windows нет связи между процессом grandpent 'bash' и' sleep'. Процесс Windows регистрирует только идентификатор своего родителя, а сервер подсистемы Windows ('csrss.exe') не поддерживает дерево процессов в стиле Unix. С другой стороны, Cygwin поддерживает дерево процессов. – eryksun

+0

О, хорошо. В 'ps', когда я увидел оболочку bash grandparent bash как родительский PID, я понял, что это прямой родительский процесс сна. Я посмотрю, могу ли я запустить его в оболочке Cygwin или на машине Unix. Спасибо @eryksun. – Sagar

+0

В 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

ответ

1

проводки от комментариев, так что другие не видят в этом без ответа вопроса открытого

Вы должны будете использовать вместо parent = psutil.Process(pid).parent().

В Unix сочетание fork и exec вызывает 2-й Баш процесс, который будет заменен на сон.

Windows основана на модели создания процессов, которая является наследием, унаследованным от DEC VMS. (Дэйв Катлер управлял дизайном как VMS, так и NT. Многие из бывших инженеров DEC последовали за ним в Microsoft в 1988 году.) Ядро NT действительно может реализовать fork и exec, что и для SUA subsystem.

 Смежные вопросы

  • Нет связанных вопросов^_^