[解決済み] グレースフル・シャットダウンプロセスのシグナルはどのような順番で送ればよいのですか?
質問
で コメント について この回答 別の 質問 というコメント欄があります。
絶対に必要でない限り、kill -9 は使わないでください。 を使わないでください。SIGKILL はトラップすることができないので 殺されたプログラムは シャットダウン・ルーチンを実行することができません。 を実行できません。まず、HUP (1)を試してみてください。 次にINT (2)、そしてQUIT (3)を試してください。
については原則的に賛成です。
SIGKILL
については原則的に同意しますが、それ以外は私にとってニュースです。によって送られるデフォルトのシグナルが
kill
は
SIGTERM
であれば、任意のプロセスを緩やかにシャットダウンするための最も一般的に期待されるシグナルであると予想されます。また、私はこれまで
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を送信したとしても、それはまだ恐ろしく間違った行為なのです。
関連
-
[解決済み] bashのループリストで空白をエスケープするには?
-
[解決済み] bashでWebサーバーの応答を待つループを作成するには?
-
[解決済み] シェルスクリプトでINI値を取得するには?
-
[解決済み] Cronジョブおよびランダム時間(指定時間内
-
[解決済み] bashで端末の最終行を削除して置換するには?
-
[解決済み] Bashでディレクトリではなく、ファイルだけをリストアップする方法は?
-
[解決済み] bashスクリプトを一行ずつ実行するには?
-
[解決済み] 接頭辞・接尾辞を使った名前の変更方法について教えてください。
-
[解決済み] Bashの履歴にコマンドを表示させないようにするには?
-
[解決済み] Unixで、カレントディレクトリ以下をすべて削除するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プロセスID(PID)が存在するかどうかを確認する方法
-
[解決済み] bashのループリストで空白をエスケープするには?
-
[解決済み] Bashで引用符で囲まれた文字列の中で環境変数を使用する方法
-
[解決済み] コマンドライン・ターミナルでの乗算
-
[解決済み] set -u` による Bash による空の配列展開
-
[解決済み] シェルスクリプトで行末にセミコロンは不要?重複
-
[解決済み] シェルスクリプトからウェブブラウザを起動する方法は?
-
[解決済み] bashでスクリプトの中で宣言された変数をリストアップする方法は?
-
[解決済み] .bashrcのエイリアスをvimのシェルコマンドで使用できるようにするには?(:!...)
-
[解決済み] Bashの引数で引用符を維持するには?重複