
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 wait
Funktion nicht verwendet (ich habe viele Dispatcher-Shell-Skripte auf diese Weise geschrieben). Ich frage mich, ob ich wait
sie 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 wait
oder lauten exit
.
Ich denke, Bash-Aufrufe warten auf Sie und legen den Exit-Code irgendwo ab.
wait
ruft 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.