Wenn das Skript über die Befehlszeile einwandfrei ausgeführt wird, warum wird dasselbe Skript nach dem Ausführen von cron in den Zombie-Status versetzt und wie können Sie das Problem beheben?
Hier folgendes reales Beispiel:
[root@abc ~]# ps ax | grep Z
23880 ? Zs 0:00 [checkloadadv.sh] <defunct>
23926 pts/0 S+ 0:00 grep Z
[root@abc ~]# strace -p 23880
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
[root@abc ~]# pstree | grep checkload
init-+-crond---crond-+-checkloadadv.sh
[root@abc ~]# bash /usr/bin/checkloadadv.sh
System Load is OK : 0.05
process
zombie-process
Rahul Patil
quelle
quelle
Antworten:
Wie bei echten Zombies kann ein Zombie-Prozess nicht getötet werden, weil er bereits tot ist.
Wie es passiert
Wenn unter Linux / Unix ein Prozess stirbt / endet und alle Informationen aus dem Prozess aus dem Systemspeicher entfernt werden, bleibt nur der Prozessdeskriptor erhalten. Der Prozess wird in den Zustand Z (Zombie) versetzt. Sein übergeordneter Prozess erhält ein Signal vom Kernel:
SIGCHLD
Dies bedeutet, dass einer seiner untergeordneten Prozesse beendet wird, unterbrochen wird oder nach einer Unterbrechung fortgesetzt wird (in unserem Fall wird er einfach beendet).Der übergeordnete Prozess muss jetzt den
wait()
Syscall ausführen, um den Beendigungsstatus und andere Informationen aus seinem untergeordneten Prozess zu lesen. Dann wird der Deskriptor aus dem Speicher entfernt und der Prozess ist kein Zombie mehr.Wenn der übergeordnete Prozess den
wait()
Syscall nie aufruft , bleibt der Zombie-Prozessdeskriptor im Speicher und frisst den Verstand. Normalerweise sehen Sie keine Zombie-Prozesse, da der oben beschriebene Vorgang weniger Zeit in Anspruch nimmt.Die Morgendämmerung der Toten
Jeder Prozessdeskriptor benötigt sehr wenig Speicher, sodass einige Zombies nicht sehr gefährlich sind (wie im echten Leben). Ein Problem ist, dass jeder Zombie-Prozess seine Prozess-ID behält und ein Linux / Unix-Betriebssystem eine begrenzte Anzahl von Pids hat. Wenn eine falsch programmierte Software viele Zombie-Prozesse generiert, kann es vorkommen, dass Prozesse nicht mehr gestartet werden können, da keine Prozess-IDs mehr verfügbar sind.
Also, wenn sie in großen Gruppen sind, sind sie sehr gefährlich (wie in vielen Filmen wird sehr gut demonstriert)
Wie können wir uns gegen eine Horde Zombies verteidigen?
Ein Schuss in den Kopf würde funktionieren, aber ich kenne den Befehl dafür nicht (SIGKILL wird nicht funktionieren, weil der Prozess bereits tot ist).
Nun, Sie können SIGCHLD über kill an den übergeordneten Prozess senden, aber wenn dieses Signal ignoriert wird, was dann? Ihre einzige Möglichkeit ist, den übergeordneten Prozess zu beenden und den Zombie durch den Init-Prozess zu "adoptieren". Init ruft regelmäßig den
wait()
Syscall an, um seine Zombiekinder zu säubern.In deinem Fall
In Ihrem Fall müssen Sie SIGCHLD an den crond-Prozess senden:
Dann von einem anderen Terminal:
Die Ausgabe ist:
Sie sehen, dass der
wait4()
Syscall -1 ECHILD zurückgibt, was bedeutet, dass kein untergeordneter Prozess vorhanden ist. Die Schlussfolgerung lautet also: cron reagiert auf den SIGCHLD-Systemaufruf und sollte die Apokalypse nicht erzwingen.quelle
Wenn der übergeordnete Thread vor seinem untergeordneten Thread beendet wird, werden alle untergeordneten Threads zu Zombie-Prozessen.
quelle