107

別の質問のこの回答に対するコメントで、コメント投稿者は次のように述べています。

どうしても必要な場合を除き、kill -9 を使用しないでください。SIGKILL はトラップできないため、強制終了されたプログラムは一時ファイルを消去するなどのシャットダウン ルーチンを実行できません。最初に HUP (1)、次に INT (2)、次に QUIT (3) を試してください。

については原則として同意しますSIGKILLが、残りはニュースです。によって送信されるデフォルトのシグナルが であることを考えるとkillSIGTERM任意のプロセスを正常にシャットダウンするために最も一般的に期待されるシグナルであると思います。SIGHUPまた、デーモンに「構成ファイルを再読み込みする」ように指示するなど、終了しない理由で使用されているのを見てきました。そして、SIGINT(通常は Ctrl-C で得られるのと同じ割り込みですよね?) 本来あるべきほど広くサポートされていないか、かなり不自然に終了しているように思えます。

SIGKILLそれが最後の手段であることを考えると、任意のプロセスを可能な限り正常にシャットダウンするには、どのシグナルをどのような順序で送信する必要がありますか?

可能であれば、裏付けとなる事実 (個人的な好みや意見を超えて) または参照を使用して回答を裏付けてください。

注: bash/Cygwin を考慮したベスト プラクティスに特に関心があります。

編集:これまでのところ、INT や QUIT については誰も言及していないようで、HUP についての言及は限られています。これらを整然としたプロセスキルに含める理由はありますか?

4

7 に答える 7

138

SIGTERMは、アプリケーションに終了するように指示します。 他の信号は、シャットダウンとは関係がないが、同じ結果になる場合がある他のことをアプリケーションに通知します。それらを使用しないでください。アプリケーションをシャットダウンする場合は、そのように指示します。誤解を招くようなシグナルを与えないでください。

プロセスを終了するスマートな標準的な方法は、HUP、INT、TERM、最後にKILLなどの多数のシグナルを送信することであると考える人もいます。ばかげてる。終了の正しいシグナルはSIGTERMであり、SIGTERMがプロセスを即座に終了しない場合は、必要に応じて、アプリケーションがシグナルの処理を選択したためです。つまり、すぐに終了しないのには非常に正当な理由があります。クリーンアップ作業を行う必要があります。そのクリーンアップ作業を他のシグナルで中断した場合、メモリからまだディスクに保存されていないデータ、ハングしたままになっているクライアントアプリケーション、または事実上データ破損である「文の途中」で中断しているかどうかはわかりません。

シグナルの本当の意味の詳細については、sigaction(2)を参照してください。「デフォルトのアクション」と「説明」を混同しないでください。同じものではありません。

SIGINTは、プロセスのインタラクティブな「キーボード割り込み」を通知するために使用されます。一部のプログラムは、端末ユーザーの目的のために特別な方法で状況を処理する場合があります。

SIGHUPは、端末が消えてプロセスを監視しなくなったことを通知するために使用されます。以上です。一部のプロセスは、それに応じてシャットダウンすることを選択します。一般に、それらの操作は端末なしでは意味がないため、一部のプロセスは、構成ファイルの再チェックなどの他のことを行うことを選択します。

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

SIGKILLを送信しないでください。 SIGKILLは確かにスクリプトで送信されるべきではありません。アプリケーションがSIGTERMを処理する場合、クリーンアップに1秒かかる場合があり、1分かかる場合があり、1時間かかる場合があります。アプリケーションを終了する準備が整う前に、アプリケーションが何をしなければならないかによって異なります。アプリケーションのクリーンアップシーケンスに十分な時間がかかり、X秒後にショートカットまたはSIGKILLする必要があると「想定する」ロジックは、まったく間違っています。

アプリケーションを終了するためにSIGKILLが必要になる唯一の理由は、クリーンアップシーケンス中に何かがバグアウトした場合です。その場合、ターミナルを開いて手動でSIGKILLすることができます。それとは別に、何かをSIGKILLする理由は、それ自体がクリーンアップされないようにしたいからです。

世界の半分が5秒後に盲目的にSIGKILLを送信しますが、それでもそれを行うのはひどく間違っています。

于 2009-03-27T17:07:51.527 に答える
8

通常はSIGTERM、kill のデフォルトである を送信します。なぜかデフォルトです。妥当な時間内にプログラムがシャットダウンしない場合にのみ、SIGKILL. ただしSIGKILL、プログラムを使用すると、物事をクリーンアップする可能性がなく、データが破損する可能性があることに注意してください.

についてはSIGHUPHUP「ハングアップ」を表し、歴史的にはモデムが切断されたことを意味していました。と本質的に同等SIGTERMです。デーモンが構成の再起動または再ロードに使用することがある理由SIGHUPは、デーモンがそれらを必要としないため、デーモンが制御端末から切り離され、したがって を受信しないためSIGHUP、そのシグナルは一般的な使用のために「解放された」と見なされました。すべてのデーモンがこれをリロードに使用するわけではありません! SIGHUP のデフォルトのアクションは終了であり、多くのデーモンはそのように動作します! SIGHUPしたがって、やみくもにs をデーモンに送信して、それらが生き残ることを期待することはできません。

編集: SIGINTプロセスを終了するのはおそらく不適切です。これは、通常、プロセスに関連付けられている^Cか、プログラムを中断するための端末設定が何であれです。多くのプログラムは独自の目的でこれをキャプチャするため、機能しないのは十分に一般的です。SIGQUIT通常、コア ダンプを作成するデフォルトがあり、コア ファイルを置きたい場合を除き、これも適切な候補ではありません。

要約: 送信SIGTERMしてもプログラムが時間枠内に停止しない場合は、送信してくださいSIGKILL

于 2009-03-27T16:24:54.453 に答える
7

SIGTERM実際には、アプリケーションにメッセージを送信することを意味します。「とても親切で自殺してくれませんか」アプリケーションによってトラップおよび処理され、クリーンアップおよびシャットダウン コードを実行できます。

SIGKILLアプリケーションでトラップすることはできません。アプリケーションは、クリーンアップの機会なしに OS によって強制終了されます。

SIGTERM最初に送信し、しばらくスリープしてから送信するのが一般的SIGKILLです。

于 2009-03-27T16:53:43.183 に答える
4
  • SIGTERM は、ウィンドウで「[X] をクリックする」ことと同じです。
  • SIGTERM は、シャットダウン時に Linux が最初に使用するものです。
于 2009-03-27T16:20:28.567 に答える
0

HUPは私にはゴミのように聞こえます。デーモンに構成を再読み取りさせるために送信します。

SIGTERMは傍受される可能性があります。デーモンには、そのシグナルを受信したときに実行するクリーンアップコードがある場合があります。SIGKILLではそれはできません。したがって、SIGKILLを使用すると、デーモンの作成者にオプションを与えることはありません。

ウィキペディアで詳細をご覧ください

于 2009-03-27T16:26:16.227 に答える