Antworten:
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 einem Segmentation 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.
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
oder shutdown
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.
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.
kill -HUP 1
Quelle: http://www.cyberciti.biz/faq/linux-unix-kill-hup-1-reread-etcinittab-file/
init
Ich weiß, dieses Signal macht den Prozess nicht neu zu starten, sondern nur die /etc/inittab
Datei neu zu laden . --- Gegenteil systemctl daemon-reexec
wirklich macht systemd
( init
Ersatz unter Linux), um erneut auszuführen.
Nun, root kann den init-Prozess unter Linux beenden:
strace -p 1 -o OUT &
kill -9 1
Einzelheiten:
kill -9 1
funktioniert nicht:
-bash-4.3# trace-cmd start -e signal_deliver -f 'common_pid == 1' -e signal_generate -f 'pid == 1'
-bash-4.3# echo "My first attempt" >/sys/kernel/debug/tracing/trace_marker
-bash-4.3# kill -9 1
-bash-4.3# trace-cmd show # there is no signal_deliver-event
...
bash-164 [000] .N.. 29.302996: tracing_mark_write: My first attempt
bash-164 [000] d... 29.312586: signal_generate: sig=9 errno=0 code=0 comm=systemd pid=1 grp=1 res=1
Also, lass uns laufen strace
:
-bash-4.3# echo 1 >/proc/sys/kernel/ftrace_dump_on_oops
-bash-4.3# strace -p 1 -o OUT &
[1] 179
strace: Process 1 attached
-bash-4.3# echo "My second attempt" >/sys/kernel/debug/tracing/trace_marker
-bash-4.3# kill -9 1
bash-4.3# [ 134.943439] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000009
[ 134.943439]
[ 134.943439] CPU: 0 PID: 1 Comm: systemd Not tainted 4.7.2-201.fc24.x86_64 #1
[ 134.943439] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.9.1-1.fc24 04/01/2014
[ 134.943439] 0000000000000086 00000000610ec632 ffff88001ea43c10 ffffffff813d941f
[ 134.943439] ffffffff81a290c0 ffff88001ea43ca8 ffff88001ea43c98 ffffffff811b2cb6
[ 134.943439] ffffffff00000010 ffff88001ea43ca8 ffff88001ea43c40 00000000610ec632
[ 134.943439] Call Trace:
[ 134.943439] [<ffffffff813d941f>] dump_stack+0x63/0x84
[ 134.943439] [<ffffffff811b2cb6>] panic+0xde/0x22a
[ 134.943439] [<ffffffff810a40ac>] do_exit+0xb6c/0xb70
[ 134.943439] [<ffffffff810a4137>] do_group_exit+0x47/0xb0
[ 134.943439] [<ffffffff810af3ed>] get_signal+0x28d/0x630
[ 134.943439] [<ffffffff81025f57>] do_signal+0x37/0x6c0
[ 134.943439] [<ffffffff8100325b>] ? do_audit_syscall_entry+0x4b/0x70
[ 134.943439] [<ffffffff810ca250>] ? wake_up_q+0x70/0x70
[ 134.943439] [<ffffffff8100330c>] exit_to_usermode_loop+0x8c/0xd0
[ 134.943439] [<ffffffff81003df3>] do_syscall_64+0x103/0x110
[ 134.943439] [<ffffffff817eb921>] entry_SYSCALL64_slow_path+0x25/0x25
[ 134.943439] Dumping ftrace buffer:
[ 134.943439] ---------------------------------
[ 134.943439] bash-154 0.... 10592888us : tracing_mark_write: My first attempt
[ 134.943439] bash-154 0d... 17328079us : signal_generate: sig=9 errno=0 code=0 comm=systemd pid=1 grp=1 res=1
[ 134.943439] bash-154 0.... 80772500us : tracing_mark_write: My second attempt
[ 134.943439] bash-154 0dN.. 85426791us : signal_generate: sig=9 errno=0 code=0 comm=systemd pid=1 grp=1 res=0
[ 134.943439] systemd-1 0d... 85437478us : signal_deliver: sig=9 errno=0 code=0 sa_handler=0 sa_flags=0
[ 134.943439] ---------------------------------
[ 134.943439] Kernel Offset: disabled
[ 134.943439] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000009
[ 134.943439]
SIGKILL
, PID1
seit github.com/torvalds/linux/commit/… zusammengeführt wurde.
Tippen Sie sudo kill -INT 1
, und sehen Sie, was passiert.