GNU/Linux >> Linux の 問題 >  >> Linux

SIGINT は、SIGTERM、SIGQUIT、SIGKILL などの他の終了シグナルとどのように関連していますか?

SIGTERM および SIGKILL は、汎用の「このプロセスを終了する」要求を対象としています。 SIGTERM (デフォルト) および SIGKILL (常に) は、プロセスの終了を引き起こします。 SIGTERM は、プロセスによってキャッチされる場合があります (たとえば、必要に応じて独自のクリーンアップを実行できるようにするため)、または完全に無視されることさえあります。ただし、SIGKILL をキャッチまたは無視することはできません。

SIGINT と SIGQUIT は、ターミナルからのリクエスト専用です。これらのシグナルを生成するために、特定の入力文字を割り当てることができます (ターミナル制御の設定によって異なります)。 SIGINT のデフォルト アクションは、SIGTERM のデフォルト アクションおよび SIGKILL の変更不可能なアクションと同じ種類のプロセス終了です。 SIGQUIT のデフォルト アクションもプロセスの終了ですが、コア ダンプの生成など、追加の実装定義のアクションが発生する場合があります。必要に応じて、プロセスによってキャッチまたは無視できます。

あなたが言うように、SIGHUPは、終了信号そのものではなく、端末接続が失われたことを示すことを目的としています。しかし、繰り返しますが、SIGHUP のデフォルト アクション (プロセスがそれをキャッチまたは無視しない場合) は、SIGTERM などと同じ方法でプロセスを終了することです。

signal.h の POSIX 定義に表があります。 これには、さまざまなシグナルとそのデフォルトのアクションと目的がリストされています。一般的な端末インターフェイスの章には、端末関連のシグナルに関する詳細が含まれています。


DarkDust が指摘したように、多くのシグナルは同じ結果をもたらしますが、プロセスは各シグナルの生成方法を区別することで、異なるアクションをそれらに関連付けることができます。 FreeBSD カーネル ソース コード (kern_sig.c) を見ると、2 つのシグナルが同じように処理され、プロセスを終了し、任意のスレッドに配信されることがわかります。

SA_KILL|SA_PROC,             /* SIGINT */
SA_KILL|SA_PROC,             /* SIGTERM */

man 7 signal

これは、Linux シグナル情報を得るためによく見たい Linux マンページ プロジェクトの便利な非規範的なマンページです。

バージョン 3.22 では、次のような興味深いことが言及されています。

<ブロック引用>

シグナル SIGKILL および SIGSTOP は、キャッチ、ブロック、または無視できません。

テーブルが含まれています:

Signal     Value     Action   Comment
----------------------------------------------------------------------
SIGHUP        1       Term    Hangup detected on controlling terminal
                              or death of controlling process
SIGINT        2       Term    Interrupt from keyboard
SIGQUIT       3       Core    Quit from keyboard
SIGILL        4       Core    Illegal Instruction
SIGABRT       6       Core    Abort signal from abort(3)
SIGFPE        8       Core    Floating point exception
SIGKILL       9       Term    Kill signal
SIGSEGV      11       Core    Invalid memory reference
SIGPIPE      13       Term    Broken pipe: write to pipe with no
                              readers
SIGALRM      14       Term    Timer signal from alarm(2)
SIGTERM      15       Term    Termination signal
SIGUSR1   30,10,16    Term    User-defined signal 1
SIGUSR2   31,12,17    Term    User-defined signal 2
SIGCHLD   20,17,18    Ign     Child stopped or terminated
SIGCONT   19,18,25    Cont    Continue if stopped
SIGSTOP   17,19,23    Stop    Stop process
SIGTSTP   18,20,24    Stop    Stop typed at tty
SIGTTIN   21,21,26    Stop    tty input for background process
SIGTTOU   22,22,27    Stop    tty output for background process

シグナル Action をまとめたもの それは例えばSIGQUIT にはアクション Core があるため、SIGQUIT からの SIGQUIT および SIGINT Term .

アクションは同じドキュメントに記載されています:

The entries in the "Action" column of the tables below specify the default disposition for each signal, as follows:

Term   Default action is to terminate the process.

Ign    Default action is to ignore the signal.
Core   Default action is to terminate the process and dump core (see core(5)).
Stop   Default action is to stop the process.
Cont   Default action is to continue the process if it is currently stopped.

カーネルの観点からは、SIGTERM と SIGINT の違いはわかりません。どちらもアクション Term を持っているからです。 そしてどちらも釣れます。それは単なる「一般的な使用規則の区別」のようです:

  • 端末から CTRL-C を実行すると SIGINT が発生します
  • SIGTERM は kill によって送信されるデフォルトのシグナルです

ANSI C の信号とそうでない信号があります

大きな違いは次のとおりです。

  • SIGINT と SIGTERM は ANSI C であるため、より移植性が高くなります
  • SIGQUIT と SIGKILL は違います

それらは、C99 ドラフト N1256 のセクション「7.14 シグナル処理」で説明されています:

  • インタラクティブな注意信号の SIGINT 受信
  • SIGTERM プログラムに送信された終了リクエスト

これにより、SIGINT はインタラクティブな Ctrl + C の良い候補になります。

POSIX 7

POSIX 7 では、 signal.h でシグナルを文書化しています。 ヘッダー:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html

このページには、man 7 signal ですでに見たもののいくつかについて言及している次の興味深い表もあります。 :

Signal    Default Action   Description
SIGABRT   A                Process abort signal.
SIGALRM   T                Alarm clock.
SIGBUS    A                Access to an undefined portion of a memory object.
SIGCHLD   I                Child process terminated, stopped,
SIGCONT   C                Continue executing, if stopped.
SIGFPE    A                Erroneous arithmetic operation.
SIGHUP    T                Hangup.
SIGILL    A                Illegal instruction.
SIGINT    T                Terminal interrupt signal.
SIGKILL   T                Kill (cannot be caught or ignored).
SIGPIPE   T                Write on a pipe with no one to read it.
SIGQUIT   A                Terminal quit signal.
SIGSEGV   A                Invalid memory reference.
SIGSTOP   S                Stop executing (cannot be caught or ignored).
SIGTERM   T                Termination signal.
SIGTSTP   S                Terminal stop signal.
SIGTTIN   S                Background process attempting read.
SIGTTOU   S                Background process attempting write.
SIGUSR1   T                User-defined signal 1.
SIGUSR2   T                User-defined signal 2.
SIGTRAP   A                Trace/breakpoint trap.
SIGURG    I                High bandwidth data is available at a socket.
SIGXCPU   A                CPU time limit exceeded.
SIGXFSZ   A                File size limit exceeded.

BusyBox 初期化

BusyBox の 1.29.2 デフォルト reboot コマンドはプロセスに SIGTERM を送信し、1 秒間スリープしてから SIGKILL を送信します。これは、さまざまなディストリビューションで共通の規則のようです。

BusyBox システムをシャットダウンする場合:

reboot

init プロセスにシグナルを送ります。

その後、init シグナル ハンドラーは次の呼び出しを終了します。

static void run_shutdown_and_kill_processes(void)
{
    /* Run everything to be run at "shutdown".  This is done _prior_
     * to killing everything, in case people wish to use scripts to
     * shut things down gracefully... */
    run_actions(SHUTDOWN);

    message(L_CONSOLE | L_LOG, "The system is going down NOW!");

    /* Send signals to every process _except_ pid 1 */
    kill(-1, SIGTERM);
    message(L_CONSOLE, "Sent SIG%s to all processes", "TERM");
    sync();
    sleep(1);

    kill(-1, SIGKILL);
    message(L_CONSOLE, "Sent SIG%s to all processes", "KILL");
    sync();
    /*sleep(1); - callers take care about making a pause */
}

端末に出力されます:

The system is going down NOW!
Sent SIGTERM to all processes
Sent SIGKILL to all processes

その最小限の具体例を次に示します。

カーネルから送信されるシグナル

  • シグキル:
    • OOM キラー:Linux メモリ管理における RSS と VSZ とは

Linux
  1. Linux カーネルの copy_from_user は内部でどのように機能しますか?

  2. システムはいつ SIGTERM をプロセスに送信しますか?

  3. プロセスとその子プロセスの総リソース (メモリ) を制限する方法

  1. プロセスの pid を取得し、シェル スクリプトで kill -9 を呼び出す方法は?

  2. systemd は管理対象プロセスの子プロセスの終了をどのように処理しますか?

  3. CPU は、どの物理アドレスがどの仮想アドレスにマップされているかをどのように認識しますか?

  1. .bashrcの目的とそれはどのように機能しますか?

  2. Linux – Oom Killerはどのプロセスを最初に殺すかをどのように決定しますか?

  3. Linux – Linuxカーネルはどのようにしてデバイスのメジャー番号とマイナー番号を認識しますか?