1. ホーム
  2. bash

[解決済み] グレースフル・シャットダウンプロセスのシグナルはどのような順番で送ればよいのですか?

2022-10-21 03:01:18

質問

コメント について この回答 別の 質問 というコメント欄があります。

絶対に必要でない限り、kill -9 は使わないでください。 を使わないでください。SIGKILL はトラップすることができないので 殺されたプログラムは シャットダウン・ルーチンを実行することができません。 を実行できません。まず、HUP (1)を試してみてください。 次にINT (2)、そしてQUIT (3)を試してください。

については原則的に賛成です。 SIGKILL については原則的に同意しますが、それ以外は私にとってニュースです。によって送られるデフォルトのシグナルが killSIGTERM であれば、任意のプロセスを緩やかにシャットダウンするための最も一般的に期待されるシグナルであると予想されます。また、私はこれまで SIGHUP は、デーモンに "re-read your config file." と伝えるような、終了しない理由のために使われるのを見たことがあります。 SIGINT (Ctrl-C で通常得られるのと同じ割り込み) は、あるべき姿ほどには広くサポートされていないか、むしろ優雅に終了しているように思えます。

ということは SIGKILL は最後の手段であり どの信号で、どの順番で を送るべきでしょうか?

可能であれば、(個人的な好みや意見を超えた) 事実の裏付けや参考文献であなたの答えを立証してください。

注:私は、bash/Cygwinの考慮を含むベストプラクティスに特に興味があります。

編集してください。 今のところ、誰もINTやQUITについて触れていないようですし、HUPについても限られた範囲での言及しかありません。整然としたプロセスキルにおいて、これらを含む理由はあるのでしょうか?

どのように解決するのですか?

SIGTERMはアプリケーションの終了を指示します。 他のシグナルはアプリケーションにシャットダウンとは関係のないことを伝えますが、時には同じ結果をもたらすかもしれません。 これらは使わないでください。 もし、アプリケーションをシャットダウンさせたいのであれば、そのように指示してください。 誤解を招くようなシグナルを与えないでください。

一部の人々は、プロセスを終了させるスマートな標準的な方法は、HUP、INT、TERM、そして最後に KILL のような信号のスルーを送ることであると信じています。 これは馬鹿げています。 もし、SIGTERMがプロセスを即座に終了させないなら、それは、アプリケーションがそのシグナルを処理することを選択したからです。 つまり、即座に終了しない十分な理由があるのです。 それは、クリーンアップを行うためです。 他のシグナルでそのクリーンアップ作業を中断すると、メモリからまだディスクに保存されていないデータ、ぶら下がったままのクライアント アプリケーション、または事実上のデータ破損である文の途中で中断しているのかどうかが分からなくなります。

シグナルの本当の意味についてのより詳しい情報は、sigaction(2) を参照してください。 デフォルトアクションと説明文を混同しないでください。

SIGINT は、プロセスのインタラクティブな "キーボード割り込み" を合図するために使用されます。 プログラムによっては、ターミナル ユーザーのために特別な方法で処理されることがあります。

SIGHUP は、ターミナルが消えて、プロセスを見なくなったことを知らせるために使用されます。 以上です。 プロセスによっては、一般にターミナルなしでは動作が意味をなさないため、これに応じてシャットダウンすることを選択するものもあれば、設定ファイルを再確認するなど他のことを行うことを選択するものもあります。

SIGKILL は、カーネルからプロセスを強制的に削除するために使用されます。 これは、実際にはプロセスへのシグナルではなく、むしろカーネルによって直接解釈されるという意味で特別です。

SIGKILL を送信してはいけません。 SIGKILLは確かにスクリプトから決して送信されるべきではないでしょう。 もしアプリケーションが SIGTERM を処理したら、クリーンアップに1秒かかることもあれば、1分かかることもあります。 1時間かかるかもしれません。 . アプリケーションが終了する前に何をしなければならないかによって異なります。 どんなロジックでも" を想定しています。 アプリケーションのクリーンアップ シーケンスに十分な時間がかかったため、X 秒後にショートカットまたは SIGKILL を実行する必要があるロジックは、次のとおりです。 ただの間違い .

アプリケーションの唯一の理由は が必要なのは を必要とする唯一の理由は、アプリケーションのクリーンアップ中にバグが発生した場合です。 この場合、ターミナルを開き、手動で SIGKILL することができます。 それ以外に SIGKILL が必要な理由としては 欲しい という理由だけです。

たとえ世界の半分が5秒後にやみくもにSIGKILLを送信したとしても、それはまだ恐ろしく間違った行為なのです。