Kann root den Init-Prozess töten (der Prozess mit PID 1)? Was wären ihre Konsequenzen?
Standardmäßig ist dies nicht zulässig. Unter Linux (von man 2 kill
):
Die einzigen Signale, die an die Prozess-ID 1, den Init-Prozess, gesendet werden können, sind solche, für die init explizit Signalhandler installiert hat. Auf diese Weise wird sichergestellt, dass das System nicht versehentlich heruntergefahren wird.
Pid 1 (init) kann entscheiden, sich selbst töten zu lassen. In diesem Fall ist "kill" im Grunde eine Aufforderung, sich selbst herunterzufahren. Dies ist eine Möglichkeit, den halt
Befehl zu implementieren , obwohl mir keiner bewusst ist, der init
das tut.
Auf einem Mac launchd
startet das Beenden (seines Init-Analogons) mit Signal 15 (SIGTERM) das System sofort neu, ohne die laufenden Programme sauber herunterzufahren. Wenn Sie es mit dem unauffangbaren Signal 9 (SIGKILL) töten, hat dies nichts zu bedeuten. Dies zeigt, dass die kill()
Semantik von Mac in dieser Hinsicht mit der von Linux identisch ist.
Im Moment habe ich keine Linux-Box zur Hand, mit der ich experimentieren möchte, daher muss die Frage, was Linux Und mit init
mit einem SIGTERM macht, warten. init
Ersatzprojekten wie Upstart und Systemd, die heutzutage populär sind, könnte die Antwort variabel sein.
UPDATE : Unter Linux wird init
SIGTERM explizit ignoriert, sodass nichts unternommen wird. @jsbillings hat Informationen darüber, was Upstart und Systemd tun.
init
mit einemSegmentation fault
(SIGSEGV
) Signal töten , was zu einer Kernel-Panik führt:kill -SEGV 1
Der SysV-Init ignoriert SIGKILL- oder SIGTERM-Signale. Das einzige Signal, das eine Zustandsänderung hervorruft, ist, soweit ich das beurteilen kann, SIGPWR, das eine leistungsbezogene Abschaltung vorsieht.
Es scheint, dass Upstart und Systemd auch nicht auf SIGKILL reagieren, und aus meinem Test geht hervor, dass ein SIGTERM dazu führt, dass Upstart und Systemd erneut ausgeführt werden.
Ich bin mir nicht sicher, wie die anderen Antworten lauten, aber ich bin mir ziemlich sicher, dass Sie -9 (SIGKILL) oder -15 (SIGTERM) init (pid 1) nicht töten können. Wenn Sie in der Lage wären, würden Sie höchstwahrscheinlich eine Kernel-Panik bekommen, weil init unerwartet mit einem Exit-Code ungleich Null beendet wurde, was weniger als ideal wäre. Der Computer wird nicht heruntergefahren oder neu gestartet.
quelle
Technisch gesehen kann root ein SIGKILL an init ausgeben. init unterscheidet sich jedoch von den meisten, fast allen anderen Prozessen darin, dass es erlaubt ist, das Signal einzufangen und zu ignorieren.
Sie können init locker töten, indem Sie a ausgeben,
kill -TERM 1
was analog zur Ausgabe von a wäre,halt
odershutdown
in diesem init wird das Signal an alle untergeordneten Elemente, im Wesentlichen alle anderen Prozesse, übergeben, bevor das Signal selbst berücksichtigt wird.Bitte beachten Sie: Wenn Sie diesen Befehl ausführen, wird Ihr System heruntergefahren.
Für den Geschmack; Eine andere Art von Prozess, der ein SIGKILL "ignorieren" kann, ist der ununterbrochene Schlaf, z. B. der Wartezustand auf E / A. Ein solcher Prozess könnte gefunden werden, indem ein ausgegeben wird,
ps axo stat,comm
bei dem Prozesse mit dem Status 'D' nicht unterbrechbar sind.quelle
kill -TERM 1
tun nichts anderes als Ursache init Wieder exec sich auf den meisten Linux - Systemen, und dass das einzige , was Sie tun können , ein System zum Herunterfahren Ihres Systems zu verursachen , ist zu laufenkill -PWR 1
kill -TERM 1
definitiv zu einem Neustart (tatsächlich wird der::shutdown:
Eintrag und das zugehörige Skript in inittab durchlaufen .)Sie können den
init
Prozess neu starten . Dies ist nützlich, um Änderungen vorzunehmen,inittab
ohne einen Neustart durchführen zu müssen.Quelle: http://www.cyberciti.biz/faq/linux-unix-kill-hup-1-reread-etcinittab-file/
quelle
init
Ich weiß, dieses Signal macht den Prozess nicht neu zu starten, sondern nur die/etc/inittab
Datei neu zu laden . --- Gegenteilsystemctl daemon-reexec
wirklich machtsystemd
(init
Ersatz unter Linux), um erneut auszuführen.sudo kill -INT 1
(Interrupt) startet das System neu undsudo kill -SEGV 1
(Segmentierungsverletzung) odersudo kill -ABRT 1
(Abbruch) erzeugt eine Kernel-Panik.hinweis: sudo ist erforderlich.
quelle
Nun, root kann den init-Prozess unter Linux beenden:
Einzelheiten:
kill -9 1
funktioniert nicht:Also, lass uns laufen
strace
:quelle
SIGKILL
,PID1
seit github.com/torvalds/linux/commit/… zusammengeführt wurde.Tippen Sie
sudo kill -INT 1
, und sehen Sie, was passiert.quelle