Der Fehler war hier:
MSfree hat geschrieben: 15.02.2024 08:56:35
Zombies entstehen immer dann, wenn sich ein Parentprozeß beendet und der Childprozeß weiterläuft, ohne daß ein Reparent auf den init/systemd-Prozeß stattfindet.
Wenn sich der Parent beenden wuerde, dann wuerde das Kind auf den Init-Prozess reparentet werden. Damit wuerden etwaige Zombies zur Ruhe gebettet werden.
Zombies sind es nur dann wenn der Parent noch lebt aber die Returncodes der beendeten Kindprozesses nicht abholt. Die beendeten Kindprozesse sind dann die Zombies.
Nochmal mehr Erklaerung (fuer diejenigen, die hier interessiert mitlesen):
SIGCHLD ist der Hinweis, an den Parent, dass ein Kind beendet hat und der Parent nun dessen Returncode abfragen sollte (mittels wait(2) und Co.). Der Parent muss das Signal SIGCHLD nicht behandeln, er kann auch einfach periodisch wait() aufrufen. Kurzfristig ist der Zombiestatus auch nicht schlimm, bloss sollten die Zombies halt *irgendwann* mal weggeraeumt werden, weil sie sonst -- wie du ganz richtig sagst -- Prozess-Slots blockieren.
Double-Fork hilft dann, wenn der Parent keine Lust hat, die Returncodes der beendeten Kinder abzufragen (weil sie ihn nicht interessieren). Dann kann er ein Hilfskind erzeugen, das wiederum seinerseits das eigentliche Kind (= Enkel) erzeugt. Danach beendet sich das Hilfskind direkt und der Parent kann direkt dessen Returncode abfragen, um es zur Ruhe zu betten. Der eigentliche Kindprozess (Enkel) hat dann keinen Parent mehr und wird automatisch von Init adoptiert. Falls er irgendwann spaeter mal beendet, bettet Init ihn zur Ruhe. Der Parent ist von dieser Last befreit und Zombies werden verhindert.
Hier nochmal eine offizielle Beschreibung:
Manpage wait(2) hat geschrieben:
NOTES
A child that terminates, but has not been waited for
becomes a "zombie". The kernel maintains a minimal set
of information about the zombie process (PID, termination
status, resource usage information) in order to allow the
parent to later perform a wait to obtain information
about the child. As long as a zombie is not removed from
the system via a wait, it will consume a slot in the ker‐
nel process table, and if this table fills, it will not
be possible to create further processes. If a parent
process terminates, then its "zombie" children (if any)
are adopted by init(8), which automatically performs a
wait to remove the zombies.