40 Stimmen

Wie listet man in Python alle Kindprozesse auf?

Ich verwende eine Bibliothek eines Drittanbieters, die verschiedene Unterprozesse startet. Wenn es eine Ausnahme gibt, möchte ich alle Kindprozesse beenden. Wie kann ich eine Liste der Kindpids erhalten?

0 Stimmen

Es könnte hilfreich sein, wenn Sie uns Ihr Betriebssystem nennen, da dies plattformabhängig sein wird.

1 Stimmen

Hilft Ihnen POSIX? Ich nehme an, dass einige Leute auch die Antwort für Windows wissen möchten.

0 Stimmen

54voto

Jason Martens Punkte 1175

Sie können nicht immer alle Unterprozesse protokollieren, wenn sie erstellt werden, da sie ihrerseits neue Prozesse erstellen können, die Sie nicht kennen. Es ist jedoch recht einfach, Folgendes zu verwenden psutil um sie zu finden:

import psutil

current_process = psutil.Process()
children = current_process.children(recursive=True)
for child in children:
    print('Child pid is {}'.format(child.pid))

4voto

Zac Bowling Punkte 6448

Es ist in der Regel sicherer, die Pids aller Kindprozesse zu protokollieren, wenn Sie sie erstellen. Es gibt keine Posix-konforme Möglichkeit, die PIDs der Kindprozesse aufzulisten. Ich weiß, dass man dies mit dem PS-Tool tun kann.

3 Stimmen

Ja, das habe ich erwartet. Das Problem ist, dass nicht ich die Prozesse erzeuge, sondern die Bibliothek eines Drittanbieters. Nun gut. Es ist kein Showstopper.

1 Stimmen

Ihre Antwort ist nicht die Lösung. Ich muss wirklich wissen, wie ich die psutil.Process um mir rekursive memory_info y cpu_percent aber mein Aufruf an subprocess tatsächlich öffnen andere subprocess (mindestens 4 oder 5 Ebenen) und ich habe keine Möglichkeit, einen Überblick über alle PIDs zu halten.

0 Stimmen

Dies gibt uns ein wenig mehr Informationen: stackoverflow.com/questions/3332043/

2voto

Don Kirkby Punkte 46803

Es klingt wie psutil ist die empfohlene Methode. Wenn Sie jedoch nicht von einer externen Bibliothek abhängig sein wollen, können Sie die --ppid der ps um Prozesse nach der übergeordneten ID zu filtern. (Vorausgesetzt, Sie arbeiten mit einem Betriebssystem mit ps natürlich).

Hier ist ein Ausschnitt, der zeigt, wie man es aufruft:

ps_output = run(['ps', '-opid', '--no-headers', '--ppid', str(os.getpid())],
                stdout=PIPE, encoding='utf8')
child_process_ids = [int(line) for line in ps_output.stdout.splitlines()]

0voto

Ravi Gadhia Punkte 460

Mit psutil können Sie alle untergeordneten Prozesse (auch rekursive Prozesse) abrufen, siehe https://psutil.readthedocs.io/en/latest/#psutil.Process.children

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X