initプロセスをrootで殺すことはできますか?

initプロセスをrootで殺すことはできますか?

initプロセス(pid 1を使用するプロセス)をrootで終了できますか?その結果は何ですか?

答え1

基本的にいいえ。これは許可されません。 Linuxでは(man 2 kill):

プロセスID 1(つまり、initプロセス)に送信できる唯一の信号は、initに明示的なシグナルハンドラがインストールされているシグナルです。これは、システムが予期せずクラッシュしないようにするために行われます。

Pid 1(init)は自分が終了することを決定できます。この場合、「killing」は基本的に自分の終了を要求することです。これはこのコマンドを実装する1つの可能な方法ですが、これを実行する方法haltはわかりません。init

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

現在、試してみたいというLinuxボックスはありません。したがって、initLinuxがSIGTERMを使用して実行することに関する質問は待つ必要があります。今日、UpstartやSystemdなどの代替プロジェクトがより普及しているので、init答えは変わるかもしれません。

修正する:Linux ではinitSIGTERM が明示的に無視されるため、何もしません。 @jsbillingsに情報がありますUpstartとSystemdがすること

答え2

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

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

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

答え3

技術的にはそうです。ルートは初期化のためにSIGKILLを発行できます。ただし、initは信号をキャプチャして無視できるという点で、ほとんどの(実際にはほとんどすべての)他のプロセスとは異なります。

aを実行してinitを緩やかに終了できます。これは、信号自体を尊重する前に、すべての子プロセス(デフォルトでは他のすべてのプロセス)にシグナルを渡すaまたはinitをkill -TERM 1実行するのと似ています。haltshutdown

注:このコマンドを実行してください。〜するシステムをシャットダウンします。

SIGKILLを「無視」できる別の種類のプロセスは、I / Oを待つプロセスなど、中断のない省電力状態にあるプロセスです。これらのプロセスは、ステータスps axo stat,comm「D」のプロセスを中断できないコマンドを実行することによって見つけることができます。

答え4

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

注:sudoが必要です。

関連情報