読書 スティーブンの優れた回答の1つ 、
オペレーティングシステムがシャットダウンすると、プロセスは
SIGTERM
とSIGKILL
を使用してシャットダウンされますが、これらのシグナルはカーネル(または直接ではありません— pidが0または負のpidでkill()
を呼び出すと、カーネルはシグナルをいくつかのプロセスに送信します)。それらは、サービスを終了するサービスマネージャーおよびさまざまなlast-ditch-kill-everythingアプリケーションモードプログラムから取得されますシステム管理メカニズムの一部である:例:killprocs
van Smoorenburgrc
script 、killprocs
OpenRC script 、およびsystemd-shutdown
プログラム 。
OSがシャットダウンすると、
サービスマネージャーは、サービスを終了する必要があることをどのようにして知るのですか?サービスマネージャーは、カーネルまたはプロセスからSIGKILLまたはSIGTERMまたはその他のシグナルを受信することによって通知されますか?
同様に、システム管理メカニズムの一部であるさまざまなlast-ditch-kill-everythingアプリケーションモードプログラムは、SIGTERMとSIGKILLを送信する必要があることをどのように認識しますか?
ありがとう。
サービスマネージャは、システム管理者がシステムを停止または再起動するように要求したため、サービスを終了する必要があることを認識しています。管理者がreboot
を実行するか、ユーザーが自分のデスクトップ環境で対応するオプションを選択すると、init
プロセスは(この時点ではカーネルではなく)再起動するように指示されます。 init
プロセスは、カーネルに実際に再起動するように要求する前に、実行するように構成されているすべての処理を行います。
最後の最後のすべてを強制終了するフェーズは、シャットダウン手順の一部です。シャットダウン手順が実行中のすべてのサービスの停止を要求すると、通常はしばらく待機してから、残りのプロセスをすべて強制終了します。
さまざまなinitシステムには、これらすべての実装が異なります。 sysvinit
の場合、停止または再起動はランレベルの移行であり、実行中のinit
に適切なランレベルに切り替えるように依頼することから始まります( telinit
マンページ を参照)詳細については)。 systemdの場合、それはターゲットであり、最終的に実行されます systemd-halt
service 。