
Ich bearbeite diese Frage, da sie als Duplikat markiert wurde und als weitere Frage dazu diente, wie man einen Zombie-Prozess beendet.
Ich suche nicht nach einer Antwort darauf, wie man einen Zombie-Prozess beendet. Ich habe keine Zombies auf meinem System und weiß, wie Zombies erstellt werden.
Ich versuche, die Frage anders zu formulieren. Derzeit sind dies die anerkannten Methoden, um einen Zombie zu entfernen:
Senden von SIGCHLD an das übergeordnete Element. Funktioniert theoretisch, in der Praxis jedoch nicht immer, da einer der Gründe für die Erstellung des Zombies darin liegen könnte, dass das übergeordnete Element nicht richtig auf SIGCHLD reagiert hat.
Beenden des übergeordneten Prozesses.
- Beheben des Fehlers im Programm, das den Zombie erstellt hat.
- Neustart.
Oder wie erwähnt beiHier
Oder aus diesem Grund, den @richard in den Kommentaren zu meiner Frage vor dieser Bearbeitung erwähnt hat:
..to prevent the pid being reused. The parent has the pid of the child and may signal the child (may try to kill it), just from the pid it recieved when it created the child. It would be bad for the pid to be reused. Therefore the child remains in a zombie state until the parent acknowledges the death of the child, or the parent dies.
Nun sind meine Fragen:
Warum gibt es keine einfache und direkte Methode, einen oder mehrere Zombies zu beseitigen?
Was wären die Nebenwirkungen/Konsequenzen, wenn der Zombie mit einem Signal hätte getötet werden können?
Was hält die *NIX-Wartungstechniker davon ab, ein SIGNAL oder einen Befehl zu erstellen (ich bitte um Entschuldigung, wenn der Ausdruck „ein neues Signal erstellen“ technologisch nicht akzeptabel ist), der einen Zombie beseitigt.
Antwort1
Der Prozess ist zu diesem Zeitpunkt bereits beendet. Es ergibt keinen Sinn, ihn erneut zu beenden. Er wird dennoch in der Prozesstabelle aufgezeichnet, damit der übergeordnete Prozess seinen Status übernehmen kann.
Beachten Sie, dass alle Prozesse nach dem Beenden zu Zombies werden. Sie sehen sie nur nicht, weil die meisten übergeordneten Prozesse ihre untergeordneten Prozesse sehr schnell bereinigen. Sie sollten einen Fehlerbericht einreichen, wenn eine Software ihre Zombies nicht bereinigt und sie nur bereinigt werden durchdrinsobald der übergeordnete Prozess beendet wird.
Ihre zusätzliche Frage ist, warum SIGKILL
es nicht aus der Prozesstabelle entfernt wird. Sie sollten uns zuerst sagen, warum es das sollte. Mir ist kein einziger Grund bekannt, den Benutzer einen nicht mehr funktionierenden Prozess aus der Prozesstabelle entfernen zu lassen. Beim Betriebssystemdesign sollten Sie immer eineguter Grund etwas zu tunbevor du fragstwarum sollte man es nicht tun. Sie fragen nach einer Funktion ohne tatsächlichen Anwendungsfall.
Abgesehen davon, dass es keinen Zweck hat, hätte es schlimme Konsequenzen. Der übergeordnete Prozess ruft auf wait()
und/oder waitpid()
erfährt den Status der untergeordneten Prozesse, die beendet wurden. Das Ergebnis des Aufrufs ist konsistent, unabhängig davon, ob er aufgerufen wird, bevor der Prozessverstorben, bevor Sie die ausgeben SIGKILL
, oder danach.
Wenn der Kernel die Aufzeichnungen nicht führen würde (d. h. der Prozess würde aus der Prozesstabelle entfernt), müsste das Verhalten inkonsistent sein und der übergeordnete Prozess müsste die Inkonsistenz erwarten und ohne triftigen Grund damit umgehen. In Systemen, die altepidDas Nichtaufzeichnen dieser Werte kann zu weitaus schwerwiegenderen Problemen führen, beispielsweise dazu, dass eine Software versehentlich einen völlig anderen Prozess beendet.
Siehe auch:http://en.wikipedia.org/wiki/Zombie_process