Die Übertragung hängt zeitweise an meinem NAS. Wenn ich SIGTERM sende, verschwindet es nicht aus der Prozessliste und ein <defunct>
Etikett wird daneben angezeigt. Wenn ich ein SIGKILL sende, verschwindet es immer noch nicht und ich kann das übergeordnete Element nicht beenden, da es das übergeordnete Element ist init
. Der einzige Weg, den Prozess loszuwerden und Transmission neu zu starten, ist ein Neustart.
Mir ist klar, dass das Beste, was ich tun kann, darin besteht, Transmission zu reparieren (und ich habe es versucht), aber ich bin ein Anfänger beim Kompilieren und wollte sicherstellen, dass meine Torrents fertig sind, bevor ich anfange, damit herumzuspielen.
init
sollten ziemlich schnellinit
verschwinden, da sie regelmäßig auf Kinder warten, da dies eine der häufigsten Aufgaben ist. Ist<defunct>
das dasselbe wie ein Zombie?<defunct>
ist genau das gleiche wie ein Zombie.init
wird auf seine Kinder warten, so sollte dies theoretisch nie passieren. Ich frage mich , was passiert , wenn Sie ein sendenSIGCHLD
aninit
?Antworten:
Sie können einen
<defunct>
Prozess (auch als Zombie-Prozess bezeichnet) nicht beenden, da er bereits tot ist. Das System speichert Zombie-Prozesse, damit die Eltern den Exit-Status abrufen können. Wenn das übergeordnete Element den Beendigungsstatus nicht erfasst, bleiben die Zombieprozesse für immer bestehen. Die einzige Möglichkeit, diese Zombie-Prozesse loszuwerden, besteht darin, die Eltern zu töten. Wenn das übergeordnete Element init ist, können Sie nur einen Neustart durchführen.Zombie-Prozesse beanspruchen fast keine Ressourcen, so dass es keine Leistungskosten gibt, wenn sie verweilen. Obwohl das Vorhandensein von Zombie-Prozessen in der Regel bedeutet, dass einige Ihrer Programme fehlerhaft sind. Init sollte normalerweise alle Kinder sammeln. Wenn init Zombie-Kinder hat, dann gibt es einen Fehler in init (oder anderswo, aber einen Fehler).
http://en.wikipedia.org/wiki/Zombie_process
quelle
init
kann nie Zombiekinder haben. Aus dem Wikipedia-Artikel: Wenn ein Prozess sein übergeordnetes Element verliert, wird init zu seinem neuen übergeordneten Element. Init führt regelmäßig den Systemaufruf wait aus, um alle Zombies mit init als übergeordnetem Element zu ernten. Eine seinerinit
Aufgaben ist es, Waisen und elternlose Zombies zu ernten.init
Kann aber Bugs haben. Die Init-Ersetzungrunit
hatte einen Fehler, der dieses Problem verursacht.Jeder, der versucht, den Transmission C-Quellcode zu reparieren, sollte etwas über den "Double Fork" -Trick lesen, um Zombies und Signal-Handler zu vermeiden ... und darüber, wie er als Teil einer intelligenten variadischen Spawn-Funktion verwendet werden kann (siehe Spawning in Unix ).
quelle
exit(3)
; Die Kinder sollten_exit(2)
stattdessen anrufen (ansonsten erhalten Sie unter anderem mehrere Stdio-Flushes). # 2: Dasexecvp(3)
könnte einperror(3)
brauchen, wenn es fehlschlägt. # 3: Du solltest einfachsignal(SIGCHLD, SIG_IGN)
anstatt dieses ganzen Chaos verwenden.