Analysieren Sie die pstree-Ausgabe, um die übergeordneten und untergeordneten PIDs eines bestimmten Prozessnamens aufzulisten

574
reddi hari

Ich führe zwei Instanzen eines aufgerufenen Programms aus SMU, daher gibt es zwei separate Prozesse mit demselben Namen SMU. Jeder SMUProzess erstellt einen (mehr als 1) untergeordneten Prozess. Daher gibt es jetzt 4 Prozesse mit demselben Prozessnamen wie unten gezeigt (wobei 22313, 23835 übergeordnete Prozesse von zwei verschiedenen Instanzen sind).

22313 pts/10 00:35:00 SMU 22314 pts/10 00:35:06 SMU 23835 pts/6 00:25:02 SMU 23836 pts/6 00:24:56 SMU 

Ich möchte einen separaten C-Code schreiben, in dem ich eine verknüpfte Liste pro Instanz erstellen möchte, um SMUalle PIDs dieses Prozessbaums aufzulisten.
Ich muss also wissen, wie ich feststellen kann, wie viele Instanzen ausgeführt werden, wie PIDs mit demselben Namen gefunden werden können, welcher Prozess zu welcher Prozessgruppe gehört und ob der Prozess Child oder Parent ist.

Gibt es irgendwelche C-APIs, die die Arbeit für mich erledigen, und pstreewie kann ich sie verwenden, um meine Anforderungen zu erfüllen?

0

1 Antwort auf die Frage

2
grawity

Der Versuch, die Ausgabe eines benutzerbezogenen Befehls zu parsen, wird in der Regel mit großem Abstand zum fragilsten Teil Ihres Programms. (Vor allem etwas so komplexes wie pstree-Ausgabe.) Die Ausgabe ist für den Menschen gedacht und nicht für den Computerkonsum geeignet. Sie kann zwischen Programmversionen oder je nach Systemgebietsschema (Datum, Sprache, Zeichensatz) oder abhängig von den lokalen Anpassungen des Benutzers wechseln. Pstree nicht parsen.

Unter Linux ist die Hauptmethode zum Aufzählen von Prozessen - die Quelle dieser Informationen - das Auflisten von Unterverzeichnissen von / proc mit nur numerischen Namen. Jedes dieser Verzeichnisse stellt einen Prozess dar und sein Name ist die PID. Das übergeordnete Element kann durch Lesen /proc/<pid>/statusund Suchen des PPid:Attributs (neben sich Pid:selbst) ermittelt werden.

Um dies zu tun bequeme, können Sie eine der von einem dritten APIs verwenden libprocps : neue API - procps_proctab_read()oder alte API - readproc(), readproctab3().

Verwenden Sie einen Dienstmanager, um mehrere Instanzen eines Diensts zu verwalten. Die meisten Linux-Systeme enthalten eines (Systemd genannt). Es verfolgt automatisch, welche Prozesse zu welchem ​​Dienst gehören, so dass Befehle systemctl restart smu@foo(wie auch die entsprechenden C-APIs) immer die richtigen PIDs auswählen.

Vielen Dank für die Antwort, aber ich konnte keine Man-Pages für diese APIs finden, obwohl ~ libprocps in meinem System installiert ist. Kann ich wissen, wie Sie diese verwenden? reddi hari vor 5 Jahren 0
Die alte API hat keine Dokumente. und leider dachte ich, dass die Dokumente für 'neue API' nur ein Zukunftsplan für eine sind. Sie sind also wieder beim manuellen Durchgraben von `/ proc`, wie es scheint. grawity vor 5 Jahren 0
Ist es ein guter Plan, jede `status`-Datei von jedem Prozessverzeichnis in` / proc `zu lesen und nach der Zeichenfolge` SMU` zu suchen, damit ich alle Informationen bekomme, die ich brauche reddi hari vor 5 Jahren 0