Warum Kind noch am Leben nach der parent-Prozess war getötet in Linux?
Jemand hat mir gesagt, dass, wenn Sie getötet einem übergeordneten Prozess in linux, würde das Kind sterben.
Aber ich bezweifle es. Also schrieb ich zwei bash-Skripte, wo father.sh
aufrufen würde child.sh
Hier ist mein Skript:
Nun Lauf ich bash father.sh
, Sie könnten überprüfen Sie es ps -alf
Dann tötete ich die father.sh
durch kill -9 24588
, und ich vermutete, der Kind-Prozess beendet werden soll, aber leider war ich falsch.
Könnte jemand erklären, warum?
thx
- Ich denke, dass Sie sich schneiden könnten 80% der text und alle Bilder und noch immer alles, was zählt in dieser Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht, wenn Sie töten einen Prozess allein, es wird nicht töten die Kinder.
Müssen Sie senden das signal an den - Prozess-Gruppe wenn Sie möchten, dass alle Prozesse, die für eine bestimmte Gruppe empfangen das signal
Ansonsten Waisen wird im Zusammenhang mit
init
, wie gezeigt, durch Ihre Dritte screenshot (PPID des Kindes geworden ist 1).thepidhere
ist in der Regel die PID des übergeordneten Prozesses, kann aber herausgefunden werden sicher mitps -eo "%p %r %c %a"
. +1.PID 123
und ichkill -9 -123
ich die folgende Fehlermeldung-bash: kill: (-123) - No such process
. Bei mir läuft auf Centos 6kill: invalid option -- '2'
beim laufenkill -9 -27541
nur tunkill -9 -- -27541
orphans will be linked to init
.In der Regel die Tötung der Eltern auch tötet das Kind.
Dem Grund, dass Sie sehen das Kind noch am Leben nach der Tötung der Vater ist, weil das Kind nur sterben, nachdem er wählt, um zu behandeln das SIGKILL-Ereignis. Es muss nicht behandeln, es sofort. Dein script läuft ein sleep () - Befehl, der wird nicht aufwachen, behandeln alle Ereignisse zu löschen, bis der Schlaf ist abgeschlossen.
Warum ist PPID #1? Der Elternteil ist gestorben und ist nicht mehr in der Prozess-Tabelle. child.sh nicht verbunden unerklärlich init jetzt. Es hat einfach nicht läuft Eltern. Sagen, es ist mit init erzeugt den Eindruck, dass, wenn wir irgendwie verlassen init, init, hat die Kontrolle über das Herunterfahren des Prozesses. Es erzeugt auch den Eindruck, dass die Tötung eines Elternteils wird den Großeltern der Eigentümer eines Kindes. Beide sind nicht wahr. Das Kind-Prozess ist weiterhin in der Prozess-Tabelle und läuft, aber keine neuen Ereignisse, die darauf beruht, Prozess-ID abgewickelt werden, bis es verarbeitet SIGKILL. Was bedeutet, dass das Kind eine pre-zombie, walking dead, in der Gefahr des seins gekennzeichnet .
Töten in der Gruppe Prozess ist anders, und wird verwendet, um zu töten, die Geschwister, und die Eltern durch die Prozess-Gruppe #. Es ist wohl auch wichtig zu beachten, dass "das töten eines Prozesses" ist nicht "töten" per se, in der menschlichen Art und Weise, wo Sie erwarten, dass der Prozess zerstört werden, und alle Speicher zurückgegeben, als ob es nie war. Es sendet lediglich ein bestimmtes Ereignis unter vielen, um den Prozess für Sie zu handhaben. Wenn der Prozess nicht mit ihm umgehen, dann nach einer Weile das OS kommt und "sauber machen" zwangsweise.
Es (das töten) nicht sofort geschehen, weil das Kind (oder auch Vater) hätte etwas geschrieben auf der Festplatte und warten auf I/O zu vervollständigen oder zu tun, einige andere wichtige Aufgabe gefährdet die Stabilität des Systems oder die Integrität der Datei.
In ein interaktives Terminal.app-Sitzung der Vordergrund-Prozessgruppe id-Nummer und hintergrund-Prozess-Gruppen-id-Nummer sind unterschiedlich von design bei der job-control/monitor-Modus ist aktiviert. In anderen Worten, wenn Sie den hintergrund eines Befehls in einer job-control-fähiges Endgerät.app-Sitzung, die
$!
pid des hintergrund-Prozess ist in der Tat eine neue process group id (pgid).In einem Skript ohne job-Steuerung aktiviert, kann dies jedoch nicht der Fall sein! Die pid des hintergrund-Prozess kann nicht eine neue pgid aber ein normaler pid! Und dies ist, was bewirkt, dass die Fehlermeldung
-bash: kill: (-123) - No such process
versuchen zu töten Prozess-Gruppe, aber nur unter Angabe eine normale pid (statt einer pgid) derkill
Befehl.Dieser tötet sowohl Übergeordneten als auch zu untergeordneten
ProcessID
?