猶予期間後のSIGKILL

猶予期間後のSIGKILL

私は、これを実行しようとするプロセス マネージャーをたくさん見てきました。プロセスを強制終了するには、SIGTERM のみを使用するべきだと理解していました。プロセスがクリーンアップするのにかかる時間は不明で、低速なシステムでは数分かかることもあります。唯一の解決策は、辛抱強く待って、プログラムがクリーンアップして正常に終了するまで待つことだと常に思っていました。プロセスが SIGTERM をキャッチしない場合は、これはバグであり、ソフトウェアの保守担当者に報告する必要があります。

docker のような人気のツールもこれを実行しようとしているのを見たことがあります:

使用方法: docker stop [OPTIONS] CONTAINER [CONTAINER...]

実行中のコンテナを停止する (SIGTERM を送信し、猶予期間後に SIGKILL を送信する)

これは悪い習慣ですか? 私が興味を持っていることの 1 つは、SystemV スタイルの init システムでシャットダウン手順がどのように機能するかということです。いくつかのマニュアル ページや他の質問を見ましたが、明確な答えが見つかりません。各 init サービス (用語?) は実行レベルの変更を認識し、init スクリプトで定義されている適切な "stop" 関数を実行するのではないかと思います。各サービスが適切に終了するように、これを 1 つずつ実行するのでしょうか? init スクリプトによって処理されないプロセスはどうなるのでしょうか? SIGKILL を実行する前に猶予期間が使用されると漠然と言及している質問をいくつか見ましたが、詳しく説明してくれるか、少なくとも正しい方向を示してくれる人がいればと思っています。:)

systemd でこれがどのように機能するかについて、もっと詳しく知る手助けをしてくれる人がいれば、喜んで調査して詳しく調べます。マニュアルページも見ましたが、ここでも決定的なものは見つかりませんでした。

答え1

どちらか一方しか残らないということになります。プログラムは、SIGTERM に反応するのに必要な時間 (または望む時間) を望みます。システム (プログラム マネージャー) は終了できることを望みます。システムが永久に待機すると、プログラムは応答しないことでシステムのシャットダウンを乗っ取ることができます (プログラムが悪意のあるものかバグがあるかのいずれかの理由によります)。

通常のシャットダウン シーケンスでは、各デーモンは、デーモンの作成者またはパッケージ作成者によって提供される init スクリプト (必要に応じてシャットダウン スクリプトと呼んでください) によって終了します。デーモンによっては、init スクリプトは単に信号を送信するだけの場合もあれば、より制御されたシャットダウン (ソケットへの書き込みなど) を実行する場合もあります。init スクリプトは、デーモンが正常にシャットダウンしたことを報告するまで待機する場合もあれば、強制的に終了する場合もあります。init スクリプトは、root として実行されます (権限suの低いユーザーとしてタスクの一部を実行するために呼び出される場合があります)。init スクリプトは協力的であることが求められているため、システムを永久にハングさせたままにしておくことが許可されています。

init スクリプトがジョブを完了すると、すべてのサービスがシャットダウンされるはずです。残っているプロセスは重要でないか、または不正な動作をしているはずです。したがって、この段階で残っているプロセスはシャットダウンするように指示され (SIGTERM)、猶予期間 (プロセスにクリーンにシャットダウンする最後のチャンスを与える) 後に、システムがダウンして残っているプロセスが強制的に終了されます (SIGKILL)。

init スクリプトを通常の逮捕手続き (令状を提示したり、警告を叫んだりするなど) と考えてください。法を遵守するデーモンはこの時点でシャットダウンするはずですが、デーモンには手続きを好きなだけ遅らせることができる弁護士 (init スクリプト) がいます。通常のプロセスが終了すると、残りのデーモンは敵対的であるとみなされます。システムは警告ショット (SIGTERM) を発射し、その後、少し遅れて SIGKILL を発射します。

関連情報