Der Zombie wartet nicht auf sein Kind. Wie bei jedem Zombie-Prozess bleibt er so lange bestehen, bis seine Eltern ihn einsammeln.
Sie sollten alle beteiligten Prozesse anzeigen, um zu verstehen, was vor sich geht, und auch die PPID betrachten. Verwenden Sie diese Befehlszeile:
ps -t $(tty) -O ppid,pgid
Das übergeordnete Element des Prozesses, den Sie beenden, ist cat
. Was passiert ist, dass bash den Hintergrundbefehl cat <( sleep 100 & wait )
in einer Subshell ausführt. Da diese Subshell nur eine Umleitung einrichten und dann einen externen Befehl ausführen muss, wird diese Subshell durch den externen Befehl ersetzt. Hier ist der Überblick:
- Die ursprüngliche Bash (12126) ruft
fork
auf, um den Hintergrundbefehl cat <( sleep 100 & wait )
in einem Kind (14247) auszuführen.
- Das untergeordnete Element (14247) ruft
pipe
auf, um eine Pipe fork
zu erstellen und anschließend ein untergeordnetes Element zum Ausführen der Prozessersetzung zu erstellen sleep 100 & wait
.
- Das Enkelkind (14248) ruft
fork
an, um sleep 100
im Hintergrund zu rennen . Da das Enkelkind nicht interaktiv ist, wird der Hintergrundprozess nicht in einer separaten Prozessgruppe ausgeführt. Dann wartet das Enkelkind daraufsleep
den Ausstieg.
- Das Kind (14247) ruft auf
setpgid
(es ist ein Hintergrundjob in einer interaktiven Shell, damit es eine eigene Prozessgruppe erhält) und führt es dann execve
aus cat
. (Ich bin etwas überrascht, dass die Prozessersetzung in der Hintergrundprozessgruppe nicht stattfindet.)
- Du tötest das Enkelkind (14248). Das übergeordnete Element wird ausgeführt
cat
, das nichts über einen untergeordneten Prozess weiß und keine geschäftlichen Anrufe hat wait
. Da die Eltern des Enkels es nicht ernten, bleibt das Enkelkind als Zombie zurück.
- Beendet schließlich
cat
- entweder weil Sie es töten oder weil sleep
die Pipe zurückkehrt und schließt, sodass cat
das Ende ihrer Eingabe angezeigt wird. Zu diesem Zeitpunkt stirbt der Elternteil des Zombies, sodass der Zombie von init gesammelt wird und init ihn erntet.
Wenn Sie den Befehl in ändern
{ cat <( sleep 100 & wait ); echo done; } &
wird dann cat
in einem separaten Prozess ausgeführt, nicht im untergeordneten Element des ursprünglichen Bash-Prozesses: Das erste untergeordnete Element muss zurückbleiben, um ausgeführt zu werden echo done
. In diesem Fall bleibt das Enkelkind, wenn Sie es töten, nicht als Zombie eingeschaltet, da das Kind (das zu diesem Zeitpunkt noch Bash ausführt) es erntet.
Siehe auch Wie behandelt Linux den Zombie-Prozess und kann ein Zombie Waisen haben? Werden die Waisenkinder durch das Ernten des Zombies gestört?