rootはinitプロセスを強制終了できますか?


38

rootはinitプロセス(pid 1のプロセス)を殺すことができますか?その結果はどうなりますか?

回答:


38

デフォルトでは、いいえ、許可されていません。Linuxの場合(からman 2 kill):

プロセスID 1であるinitプロセスに送信できるシグナルは、initがシグナルハンドラーを明示的にインストールしたシグナルのみです。これは、システムが誤って停止しないようにするために行われます。

Pid 1(init)は、自身を強制終了することを決定できます。この場合、「強制終了」は基本的に自身をシャットダウンするためのリクエストです。これは、haltコマンドを実装する1つの可能な方法ですが、それを行う方法は知りませんinit

Macでは、launchdシグナル15(SIGTERM)で(そのinitアナログ)を強制終了すると、実行中のプログラムを完全にシャットダウンすることなく、システムをすぐに再起動します。キャッチできないシグナル9(SIGKILL)でそれを殺しても何もせず、kill()この点でMacのセマンティクスがLinuxのセマンティクスと同じであることを示しています。

現時点では、試してみたいLinuxボックスは手元にないので、Linux initがSIGTERM で何をするかという質問は待たなければなりません。 そして、init最近人気が高まっているUpstartやSystemdのような代替プロジェクトでは、答えはさまざまです。

更新:Linuxでは、initSIGTERMを明示的に無視するため、何もしません。@jsbillingsには、UpstartとSystemdの機能に関する情報があります。


1
あなたはすでにそれを見つけたように見えますが、後世のために:unix.stackexchange.com/questions/85364
ジャンダー

1
あなたは殺すことができるinitSegmentation faultSIGSEGV:カーネルパニックになります)信号、kill -SEGV 1
ジョンソンスチュワード

13

SysV initは、SIGKILLまたはSIGTERMシグナルを無視します。状態の変化を引き起こす唯一の信号は、私が知る限りSIGPWRであり、これは電源関連のシャットダウンをスケジュールします。

UpstartとSystemdもSIGKILLに応答しないようです。私のテストでは、SIGTERMによってupstartとsystemdが再実行されるようです。

他の回答者が何を実行しているかはわかりませんが、-9(SIGKILL)を殺すことも、-15(SIGTERM)init(pid 1)を殺すこともできないと確信しています。おそらく、可能であれば、ゼロ以外の終了コードでinitが予期せず終了したため、カーネルパニックが発生します。これは理想的ではありません。コンピューターをシャットダウンしたり、再起動させたりすることはありません。


6

技術的には、rootはSIGKILLを発行して初期化できます。ただし、initは、信号をトラップして無視することが許可されているという点で、他のほとんどすべてのプロセスとは異なります。

あなたは、緩く、発行することにより、初期化殺すことができるkill -TERM 1の発行に類似することになるのhaltか、shutdownという点で、initは信号そのものを尊重する前に、すべての子供たち、基本的に他のすべてのプロセスにシグナルを渡します。

注:このコマンド実行すると、システムシャットダウンします。

フレーバーの場合; SIGKILLを「無視」できる他のプロセスのタイプの1つは、I / Oを待機しているプロセスなど、割り込み不可能なスリープ状態にあるプロセスです。このようなps axo stat,commプロセスは、ステータスが「D」のプロセスが中断できない場所を発行することで見つけることができます。


2
実際、私のテストでkill -TERM 1は、ほとんどのLinuxシステムでinitが再実行されるだけで、システムをシャットダウンさせるためにできることは、実行することだけですkill -PWR 1
11

@jsbillings私が発行に取り組んでいる組み込みLinux SBCでは、kill -TERM 1間違いなく再起動が発生します(実際には、::shutdown:inittabのエントリと関連するスクリプトを通過します)
SF。

initが長時間D状態にある場合、システムは本当に病気です。
ジョシュア

6

initプロセスを再起動できます。これはinittab、再起動せずに変更を加えるのに便利です。

kill -HUP 1

ソース:http : //www.cyberciti.biz/faq/linux-unix-kill-hup-1-reread-etcinittab-file/


1
init私の実装では、この信号はプロセスを再起動するのではなく、/etc/inittabファイルを再ロードするだけです。---逆に、systemctl daemon-reexec実際に再実行するsystemdinitLinuxでの置き換え)。
パブーク

4

sudo kill -INT 1(割り込み)はシステムを再起動し sudo kill -SEGV 1、(セグメンテーション違反)またはsudo kill -ABRT 1(中止)はカーネルパニックを生成します。

注:sudoが必要です。


2

さて、rootは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]

github.com/torvalds/linux/commit/…がマージさSIGKILLれてPID1以来、カーネルは配信されていないようです。
エフゲニーVereshchagin

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.