1. ホーム
  2. linux

[解決済み] SIGINTと他の終了信号(SIGTERM、SIGQUIT、SIGKILL)との関連はどうなっていますか?

2022-07-17 19:12:31

質問

POSIXシステムでは、終了信号は通常次のような順序になります(多くのMANページやPOSIX Specによると)。

  1. SIGTERM - 丁寧にプロセスの終了を要求する。すべてのリソース (ファイル、ソケット、子プロセスなど) をクリーンアップし、一時ファイルなどを削除し、優雅に終了するものとする。

  2. SIGQUIT - より強制的な要求。クリーンアップが絶対に必要なリソースをクリーンアップしますが、一時ファイルを削除しないかもしれませんし、どこかにデバッグ情報を書き込むかもしれません; いくつかのシステムでは、コアダンプも書き込まれます (シグナルがアプリによってキャッチされたかどうかにかかわらず)。

  3. SIGKILL - 最も強制的な要求です。プロセスは何もするように要求されませんが、システムは好むと好まざるとにかかわらず、プロセスをクリーンアップします。ほとんどの場合、コア ダンプが書き込まれます。

SIGINT はどのようにこの絵にフィットするのでしょうか。CLI プロセスは通常、ユーザーが CRTL+C を押したときに SIGINT によって終了しますが、バックグラウンド プロセスは KILL ユーティリティを使用して SIGINT によって終了させることもできます。SIGINT が SIGTERM よりも強力かどうか、あるいは SIGINT と SIGTERM の間にまったく違いがあるかどうかは、仕様書やヘッダー ファイルを見てもわかりません。

UPDATEしました。

私がこれまでに見つけた終端信号に関する最良の記述は GNU LibC ドキュメンテーション . SIGTERMとSIGQUITの間に意図した違いがあることがよく説明されています。

SIGTERMについて書かれています。

プログラムの終了を丁重に依頼するための通常の方法です。

と、SIGQUITについて書かれています。

[...] そして、プログラムエラー信号のように、プロセスを終了させるときにコアダンプを生成します。 これは、ユーザーによって「検出された」プログラムエラーの状態であると考えることができます。[...] ある種のクリーンアップは、SIGQUITの処理では省略した方がよい。例えば、もしプログラムが 一時ファイルを作成する場合、一時ファイルを削除することで他の終了要求を処理する必要があります。 を削除することで他の終了要求を処理する必要があります。しかし、SIGQUITはそれらを削除しない方が良いのです。 コア ダンプと一緒に調べることができます。

そして、SIGHUPも十分に説明されています。SIGHUP は実際には終了信号ではなく、ユーザーとの "接続" が失われたことを意味するだけなので、アプリはユーザーがこれ以上の出力 (stdout/stderr 出力など) を読むことを期待できず、ユーザーからこれ以上期待する入力もありません。ほとんどのアプリは、終了したほうがよいということになります。理論的には、アプリはSIGHUPを受信するとデーモンモードになり、バックグラウンドプロセスとして実行され、設定されたログファイルに出力を書き込むと決定することも可能です。すでにバックグラウンドで実行されているほとんどのデーモンでは、SIGHUP は通常、設定ファイルを再調査することを意味するので、設定ファイルを編集した後にバックグラウンド プロセスに送信します。

しかし、このページには、SIGINT が CRTL+C によって送信されるということ以外に、有用な説明がありません。SIGTERM とは異なる方法で SIGINT を処理する理由はあるのでしょうか。もしそうなら、それはどのような理由で、どのように処理が異なるのでしょうか?

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

SIGTERM と SIGKILL は、汎用の "terminate this process" 要求を対象としています。 SIGTERM (デフォルト) と SIGKILL (常に) はプロセスの終了を引き起こします。 SIGTERM はプロセスによって捕捉されたり (たとえば、プロセス自身がクリーンアップを行いたい場合など)、完全に無視されることがありますが、SIGKILL は捕捉したり無視したりすることはできません。

SIGINT と SIGQUIT は、特に端末からの要求を意図したもので、特定の入力文字をこれらの信号を生成するために割り当てることができます (端末制御設定に依存します)。 SIGINT のデフォルトの動作は、SIGTERM のデフォルトの動作および SIGKILL の変更できない動作と同じ種類のプロセス終了です。SIGQUIT のデフォルトの動作もプロセス終了ですが、コアダンプの生成など、実装で定義された追加の動作が発生する場合があります。 SIGQUIT のデフォルトの動作もプロセスの終了ですが、コアダンプの生成など、実装で定義された追加の動作が発生する場合があります。

SIGHUP は、おっしゃるとおり、終了信号というよりも、端末接続が切れたことを示すためのものです。 しかし、繰り返しになりますが、SIGHUP のデフォルトの動作は (プロセスがそれをキャッチまたは無視しない場合) SIGTERM などと同じようにプロセスを終了させることです .

の中にテーブルがあります。 POSIX の定義に signal.h は、様々なシグナルとそのデフォルトのアクションと目的をリストアップしている 一般的な端末のインターフェイス の章では、ターミナル関連のシグナルについてより詳しく説明しています。