Rootはinitプロセス(pid 1のプロセス)を強制終了できますか?その結果はどうなりますか?
デフォルトでは、いいえ、それは許可されていません。 Linuxの場合(_man 2 kill
_から):
プロセスID 1、initプロセスに送信できるシグナルは、initがシグナルハンドラーを明示的にインストールしたシグナルのみです。これは、システムが誤って停止しないようにするためです。
Pid 1(init)は、自分自身の強制終了を決定できます。この場合、「強制終了」は基本的に、自分自身をシャットダウンするための要求です。これは、halt
コマンドを実装する1つの可能な方法ですが、これを行うinit
については知りません。
Macでは、シグナル15(SIGTERM)でlaunchd
(そのinitアナログ)を強制終了すると、実行中のプログラムを完全にシャットダウンする必要がなく、システムがすぐに再起動します。キャッチできないシグナル9(SIGKILL)でこれを強制終了しても何も行われず、この点でMacのkill()
セマンティクスはLinuxのセマンティクスと同じです。
現時点では、試してみたいLinuxボックスが手元にないので、Linuxの また、最近のUpstartやSystemdのようなinit
がSIGTERMで何をするかという質問は待たなければなりません。init
置換プロジェクトが普及しているため、答えはさまざまです。
[〜#〜] update [〜#〜]:Linuxでは、init
はSIGTERMを明示的に無視するため、何も実行されません。 @jsbillingsには、UpstartとSystemdの機能に関する情報があります。
SysV initはSIGKILLまたはSIGTERMシグナルを無視します。状態の変化を引き起こす唯一の信号は、私が知る限り、電源関連のシャットダウンをスケジュールするSIGPWRです。
UpstartとSystemdもSIGKILLに応答しないようです。私のテストから、SIGTERMによってupstartとsystemdが再実行されるようです。
他の回答者が何を実行しているかはわかりませんが、-9(SIGKILL)または-15(SIGTERM)init(pid 1)を強制終了できないと確信しています。可能であれば、initがゼロ以外の終了コードで予期せず終了したため、カーネルパニックが発生する可能性が高く、これは理想的ではありません。コンピュータをシャットダウンしたり、再起動したりすることはありません。
技術的にはい、rootはSIGKILLを発行して初期化できます。ただし、initは、シグナルをトラップして無視することが許可されているという点で、ほとんどすべての実際のプロセスとは異なります。
大まかに言うと、kill -TERM 1
を発行することでinitを強制終了できます。これは、halt
またはshutdown
を発行するのと類似しており、そのinitがすべての子、基本的には他のすべてのプロセスにシグナルを渡します。 、信号自体を尊重する前。
注意:このコマンドの実行willシステムをシャットダウンします。
風味について; SIGKILLを「無視」できる他のタイプのプロセスの1つは、I/Oを待っているプロセスなど、割り込み不可能なスリープ状態にあるプロセスです。このようなプロセスは、ps axo stat,comm
を発行して見つけることができます。ステータスが「D」のプロセスは中断できません。
init
プロセスを再起動できます。これは、再起動せずにinittab
に変更を加える場合に役立ちます。
kill -HUP 1
ソース: http://www.cyberciti.biz/faq/linux-unix-kill-hup-1-reread-etcinittab-file/
Sudo kill -INT 1
(割り込み)はシステムを再起動し、Sudo kill -SEGV 1
、(セグメンテーション違反)またはSudo kill -ABRT 1
(abort)は、カーネルパニックを生成します。
注:Sudoが必要です。
まあ、ルートはLinuxのinitプロセスを殺すことができます:
strace -p 1 -o OUT &
kill -9 1
詳細:
kill -9 1
が機能しません:
-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
では、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]