web-dev-qa-db-ja.com

オペレーティングシステムがシャットダウンしたとき、サービスマネージャは、SIGTERMとSIGKILLをサービスに送信する必要があることをどのようにして知るのでしょうか。

読書 スティーブンの優れた回答の1つ

オペレーティングシステムがシャットダウンすると、プロセスはSIGTERMSIGKILLを使用してシャットダウンされますが、これらのシグナルはカーネル(または直接ではありません— pidが0または負のpidで kill() を呼び出すと、カーネルはシグナルをいくつかのプロセスに送信します)。それらは、サービスを終了するサービスマネージャーおよびさまざまなlast-ditch-kill-everythingアプリケーションモードプログラムから取得されますシステム管理メカニズムの一部である:例: killprocs van Smoorenburg rc scriptkillprocs OpenRC script 、および systemd-shutdownプログラム

OSがシャットダウンすると、

  • サービスマネージャーは、サービスを終了する必要があることをどのようにして知るのですか?サービスマネージャーは、カーネルまたはプロセスからSIGKILLまたはSIGTERMまたはその他のシグナルを受信することによって通知されますか?

  • 同様に、システム管理メカニズムの一部であるさまざまなlast-ditch-kill-everythingアプリケーションモードプログラムは、SIGTERMとSIGKILLを送信する必要があることをどのように認識しますか?

ありがとう。

1
Tim

サービスマネージャは、システム管理者がシステムを停止または再起動するように要求したため、サービスを終了する必要があることを認識しています。管理者がrebootを実行するか、ユーザーが自分のデスクトップ環境で対応するオプションを選択すると、initプロセスは(この時点ではカーネルではなく)再起動するように指示されます。 initプロセスは、カーネルに実際に再起動するように要求する前に、実行するように構成されているすべての処理を行います。

最後の最後のすべてを強制終了するフェーズは、シャットダウン手順の一部です。シャットダウン手順が実行中のすべてのサービスの停止を要求すると、通常はしばらく待機してから、残りのプロセスをすべて強制終了します。

さまざまなinitシステムには、これらすべての実装が異なります。 sysvinitの場合、停止または再起動はランレベルの移行であり、実行中のinitに適切なランレベルに切り替えるように依頼することから始まります( telinitマンページ を参照)詳細については)。 systemdの場合、それはターゲットであり、最終的に実行されます systemd-halt service

2
Stephen Kitt