Frage

Wie kann ich Informationen über den Zustand eines Prozesses erhalten (das heißt, wenn es ein Zombie) unter Verwendung von C unter Linux?

Nachdem die Antworten zu lesen, so weit ich meine Frage möge etwas verengen: Ich würde eine reine C-Lösung bevorzugen. Nach der ps Quelle zu lesen (was liest / proc /) dachte ich, dass es ein besserer Weg sein sollte, und fragte mich hier:)

War es hilfreich?

Lösung

Sie werden mit dem / proc / „psuedo-Dateisystem“ über typische C-Standardbibliothek Anrufe über die Interaktion lernen wollen. Die Dokumentation notwendig, um zu beginnen ist mit jeder Linux-Distribution enthalten ist und eine einfache Google-Suche entfernt.

(Nun, da Sie wissen, was zu suchen. Ich weiß, dass in der Regel die meisten der Herausforderung!)

Kurz gesagt, die Verzeichnisse und Dateien im Verzeichnis / proc / eines laufenden Linux-System spiegeln den Zustand des laufenden Kernels, die (natürlich) Prozesse beinhaltet. Bevor Sie jedoch in Ihnen aufladen müssen einige Informationen im Auge behalten.

Ein Zombie-Prozess ist nicht dasselbe wie ein verwaistes Prozess. Ein verwaister Prozess ist ein Prozess, in einem Wartezustand läuft gelassen nach dem Prozess Eltern falsch beendet werden. Ein Zombie-Prozess ist ein Prozess, der richtig verlassen hat, alle seine Ressourcen freigegeben, wird aber einen Platz in der Prozesstabelle beibehalten wird.

Dies geschieht in der Regel, wenn ein Prozess durch ein Programm gestartet wird. Sie sehen, wird der Kernel nicht einen fertigen Teilprozess Eintrag in der Prozesstabelle entfernen, bis das übergeordnete Programm richtig den Rückgabestatus des Teilprozesses abruft. Das macht Sinn; Wie sonst wäre das übergeordnete Programm wissen, ob die subprocess unsachgemäß verlassen?

So sind alle Teilprozesse technisch Zombies für zumindest eine sehr kurze Zeit. Es ist nicht von Natur aus einem schlechten Zustand für ein Programm, in.

Tatsächlich „Zombies“ werden manchmal absichtlich geschaffen. Zum Beispiel wird manchmal ein Zombie Eintrag durch ein Programm für eine Weile an seinem Platz belassen, so dass weitere gestartete Prozesse nicht die gleiche PID wie der zuvor gestarteten (und jetzt Zombie) Prozess.

Mit anderen Worten, wenn Sie SIGCHLDing Zombie-Prozesse gehen unnötig möglicherweise ein ernstes Problem für das Laich Programm erstellen. Wenn jedoch ein Verfahren ein Zombie für eine halbe Stunde ist oder mehr, ist es wahrscheinlich ein Zeichen für einen Fehler.

Edit: Die Frage geändert auf mich! Nein, es gibt keinen einfacheren Weg, als wie ps tut es. Wenn es, wäre es vor langer Zeit in ps integriert. Die / proc-Dateien sind die A-end-all-Quelle für Informationen über den Zustand des Kernels. :)

Andere Tipps

Ich kenne nur zwei Möglichkeiten:

  • Parsing Ausgang des ps Befehl
  • Lesen von Dateien in / proc / PID, wobei PID die Prozess-ID (das ist, was ps intern tut)

Sie wollen laufen die Prozesse auf Ihrem Computer verwenden Sie dann

$ ps aux

ps zeigt Informationen zu einer Auswahl der aktiven Prozesse. Wenn Sie eine sich wiederholende Aktualisierung der Auswahl und die angezeigten Informationen möchten, verwenden Sie oben statt.

hier :

Use this command to display all of your zombie processes:

ps aux | awk '{ print $8 " " $2 }' | grep -w Z

Dies leicht analysiert werden kann unter Verwendung von C.

Pseudo-Dateisystem / proc beschreibt Kernel internen Datenstrukturen und gibt Ihnen Gelegenheit, einige Werte direkt zu verändern. Erhalten Zustand bestimmten Prozesses mit I / O-C-Funktionen können leicht implementiert. Die richtige Datei zu analysieren ist: / proc / {PID} / Status

Befehl unten kann verwendet werden, zu erhalten, Prozesse in der Zombie-Zustand.

for proc in $(echo /proc/[0-9]*);do if [[ $(sed -n '/^State:\tZ/p' ${proc}/status 2>/dev/null) ]];then basename $proc;fi;done
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top