猶予期間以降のSIGKILL

猶予期間以降のSIGKILL

私は多くのプロセスマネージャがこれを行うのを見ました。私が理解したように、プロセスを終了するにはSIGTERMのみを使用する必要があります。プロセス自体をクリーンアップするのに不明な時間がかかる可能性があり、遅いシステムでは数分かかることがあります。私はいつも唯一の解決策は、プログラムがクリーンアップされ、正常に終了するまで忍耐を持って待つことだと思いました。プロセスがSIGTERMをキャプチャできない場合、これはバグであるため、ソフトウェア管理者に報告する必要があります。

私はdockerのような人気のあるツールもこれを行うのを見ました。

使用法: docker stop [オプション] CONTAINER [CONTAINER...]

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

これは悪い習慣ですか?私の質問の1つは、SystemVスタイルの初期化システムでシャットダウンプロセスがどのように機能するかです。いくつかのマニュアルページやその他の質問を見ましたが、明確な答えが見つかりませんでした。私は各初期化サービス(用語?)がランレベルの変更を確認し、初期化スクリプトで定義されている正しい「停止」機能を実行すると推測します。このタスクを 1 つずつ実行して、各サービスが正しく終了することを確認しますか? initスクリプトで処理されないプロセスはどうなりますか? SIGKILLの前に猶予期間を使用することについて不明瞭に言及した質問がいくつかありましたが、誰かが詳細に説明したり、少なくとも正しい方向を知らせることができることを願っています。 :)

誰もが私がsystemdのしくみをよりよく理解するのを助けることができるならば、私は喜んで調査し、もっと学びます。マニュアルページを見ましたが、明確な情報が見つかりませんでした。

ベストアンサー1

ケーキを食べて食べることもできます。プログラムはSIGTERMに反応するのに十分な時間があることを願っています。システム(プログラムマネージャ)を終了しようとしています。システムが永遠に待機すると、プログラムが応答しなくなる(プログラムが悪意あるかバグがあるため)、シャットダウンをハイジャックできます。

通常の終了順序では、各デーモンは、デーモン作成者またはパッケージ作成者が提供するinitスクリプト(必要に応じて終了スクリプトと呼ばれます)によって終了します。デーモンによっては、initスクリプトは単にシグナルを送信することも、より制御されたシャットダウンを実行することもできます(たとえば、ソケットに書き込む)。 initスクリプトは、デーモンが正常に終了したことを報告するのを待つか、強制的に終了できます。初期化スクリプトはrootとして実行されます(su一部のタスクを実行するために権限の低いユーザーとして呼び出すことができます)。そのため、システムが永久に停止する可能性があります。

initスクリプトが完了したら、すべてのサービスを終了する必要があります。残りのプロセスは重要ではないか、誤動作する必要があります。したがって、この段階では、残りのプロセスは終了するように指示され(SIGTERM)、猶予期間(完全に終了する可能性がある最後の機会を提供)後に残りのプロセスを強制的に終了するには、システムを終了する必要があります(SIGKILL)。 )。

初期化スクリプトを一般的な逮捕手順(令状の提示、警告の叫びなど)と考えてください。法に準拠したデーモンはこの時点で終了する必要がありますが、必要に応じてデーモンに弁護士(初期化スクリプト)があります。通常のプロセスが完了すると、残りのデーモンプロセスは敵対的と見なされます。システムは警告信号(SIGTERM)を発行し、遅延後にSIGKILLを発行します。

おすすめ記事