2016-05-27 18 views
0

Ich habe einen Anwendungsfall, wo ich einen Prozess habe, der parent Prozess ist und es verschiedene child Prozesse hervorbringt, die jeweils eine ssh Verbindung überwacht. Dieser parent Prozess sollte endlos als Teil eines Dienstes laufen. Aber, wenn eine dieser ssh Verbindung geschlossen ist, dann wird dieser child Prozess ein zombie Prozess. Auf diese Weise werden viele zombie Prozesse jedes Mal erstellt, wenn eine ssh Verbindung geschlossen wird.Entfernen eines Zombie-Prozesses

Ich möchte die Anzahl der zombie Prozesse so minimal wie möglich halten. So weit ich weiß, SIGTERM oder SIGKILL entfernt einen zombie Prozess. Da der parent Prozess endlos läuft, kann der zombie Prozess nicht durch Warten auf parent beendet werden.

Gibt es eine Möglichkeit, den Zombie-Prozess zu entfernen? Oder etwas, das ich falsch verstanden habe?

Antwort

1

In C-Programmierung können Sie den waitpid-Systemaufruf im übergeordneten Prozess verwenden.

In der Linux-Befehlszeile oder im Shell-Skript können Sie den Befehl wait verwenden, um die Zombies zu entfernen.

waitpid manpage,

Das waitpid() Systemaufruf unterbricht die Ausführung des aufrufenden Prozesses, bis ein Kind durch pid Argument angegeben hat Zustand geändert. Waitpid() wartet standardmäßig nur auf beendete untergeordnete Elemente, aber dieses Verhalten kann über die Optionsargumente geändert werden.

Syntax: -

pid_t waitpid(pid_t pid, int *status, int options); 

Wenn Sie nicht die Eltern anhalten möchten, dann haben Sie die unten System verwenden Aufruf der Zombie-Prozess zu löschen.

int status; 
waitpid(0, &status, WNOHANG); 

Wenn der übergeordnete Prozess tut empfängt den Exit-Status Kind, dann wird nur der Zombie-Prozess erstellt wird. Wenn Sie also die Option waitpid with WNOHANG verwenden, können Sie den Status des Child-Exit-Status erhalten. Wenn die Option WNOHANG angegeben ist, wird der Parent nicht blockiert. Wird ein Kind verlassen, speichert es den Exit-Status in der Statusvariablen und kehrt zurück. Sonst wird es nicht warten, es kehrt einfach zurück.

Versuchen Sie die waitpid man-Seite, um über den Waitpid-Systemaufruf zu lesen.

+0

Ich benutze Python. Ich habe es genauso versucht. Anstelle der 'join()' habe ich sie durch 'os.waitpid (pid, os.WNOHANG)' ersetzt. Es werden immer noch "Zombie" -Prozesse erstellt. Mache ich etwas falsch? – nidHi

+0

Haben Sie den Rückgabewert des waitpid überprüft? –

+0

Ich weiß nicht in Python. Aber ich denke, wir müssen irgendein Argument an den os.waitpid übergeben, um den exist-Status zu erhalten? –