Erzeugt dieser Dispatcher einen Zombie-Prozess?

Erzeugt dieser Dispatcher einen Zombie-Prozess?

Ich habe so ein Dispatcher-Shell-Skript.

while read line
do
    java TestProg $line &
done < $tasklist

Auf derZombie-Prozess Wikipedia-Seite, es sagt

Wenn ein übergeordneter Prozess „wait“ nicht aufruft, bleibt der Zombie in der Prozesstabelle, was zu einem Ressourcenverlust führt.

im obigen Skript habe ich die waitFunktion nicht verwendet (ich habe viele Dispatcher-Shell-Skripte auf diese Weise geschrieben). Ich frage mich, ob ich waitsie so verwenden muss, um Zombie-Prozesse zu verhindern:

while read line
do
    java TestProg $line &
done < $tasklist
wait

Antwort1

Ich habe 2 Antworten:

Wenn das übergeordnete Element stirbt/endet, werden die Prozesse von init übernommen. init erledigt das für Sie. Bei kurzzeitigen Prozessen müssen Sie sich also keine Sorgen machen. Der Ratschlag sollte call waitoder lauten exit.

Ich denke, Bash-Aufrufe warten auf Sie und legen den Exit-Code irgendwo ab.

waitruft nur die Exit-Codes ab und erntet dann den Prozess. Ein Zombie verbraucht nur wenige Ressourcen, alles wird freigegeben, außer einem Platz in der Prozesstabelle: der Prozess-ID usw.

Ein Zombie ist tot: Alle seine Ressourcen sind freigegeben, außer seinem Slot in der Prozesstabelle. Der Grund dafür, dass sein Slot in der Prozesstabelle nicht freigegeben wird, ist, dass der übergeordnete Prozess (unter anderem) seinen Rückgabecode abrufen und einem gerade gestorbenen untergeordneten Prozess signalisieren kann, ohne einen anderen Prozess zu treffen, der die Prozessidentität (PID) wiederverwendet.

verwandte Informationen