GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie verhält sich SIGINT zu den anderen Beendigungssignalen wie SIGTERM, SIGQUIT und SIGKILL?

SIGTERM und SIGKILL sind für allgemeine Anfragen zum Beenden dieses Prozesses vorgesehen. SIGTERM (standardmäßig) und SIGKILL (immer) führen zur Prozessbeendigung. SIGTERM kann vom Prozess abgefangen werden (z. B. damit er seine eigene Bereinigung durchführen kann, wenn er möchte) oder sogar vollständig ignoriert werden; aber SIGKILL kann nicht gefangen oder ignoriert werden.

SIGINT und SIGQUIT sind speziell für Abfragen vom Terminal gedacht:Zur Generierung dieser Signale können bestimmte Eingabezeichen zugewiesen werden (abhängig von den Einstellungen der Terminalsteuerung). Die Standardaktion für SIGINT ist die gleiche Art der Prozessbeendigung wie die Standardaktion für SIGTERM und die unveränderliche Aktion für SIGKILL; Die Standardaktion für SIGQUIT ist ebenfalls die Prozessbeendigung, es können jedoch zusätzliche implementierungsdefinierte Aktionen auftreten, z. B. die Generierung eines Core-Dump. Beides kann bei Bedarf vom Prozess abgefangen oder ignoriert werden.

SIGHUP soll, wie Sie sagen, anzeigen, dass die Terminalverbindung unterbrochen wurde, und nicht als Abschlusssignal dienen. Aber noch einmal, die Standardaktion für SIGHUP (wenn der Prozess es nicht abfängt oder ignoriert) ist es, den Prozess auf die gleiche Weise wie SIGTERM etc. zu beenden.

Für signal.h gibt es eine Tabelle in den POSIX-Definitionen das die verschiedenen Signale und ihre Standardaktionen und -zwecke auflistet, und das Kapitel Allgemeine Terminalschnittstelle enthält viel mehr Details zu den terminalbezogenen Signalen.


Wie DarkDust feststellte, haben viele Signale die gleichen Ergebnisse, aber Prozesse können ihnen unterschiedliche Aktionen zuweisen, indem sie unterscheiden, wie jedes Signal erzeugt wird. Wenn ich mir den FreeBSD-Kernel-Quellcode (kern_sig.c) ansehe, sehe ich, dass die beiden Signale auf die gleiche Weise behandelt werden, sie beenden den Prozess und werden an jeden Thread geliefert.

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

man 7 signal

Dies ist die praktische, nicht normative Manpage des Linux-Manpages-Projekts, die Sie häufig nach Informationen zu Linux-Signalen durchsuchen möchten.

Version 3.22 erwähnt interessante Dinge wie:

Die Signale SIGKILL und SIGSTOP können nicht abgefangen, blockiert oder ignoriert werden.

und enthält die Tabelle:

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

das Signal Action zusammenfasst das unterscheidet z. SIGQUIT von SIGQUIT, da SIGQUIT Aktion Core hat und SIGINT Term .

Die Aktionen sind im gleichen Dokument dokumentiert:

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.

Ich kann aus Sicht des Kernels keinen Unterschied zwischen SIGTERM und SIGINT erkennen, da beide die Aktion Term haben und beide können gefangen werden. Es scheint, dass dies nur eine "allgemeine Verwendungskonventionsunterscheidung" ist:

  • SIGINT ist das, was passiert, wenn Sie STRG-C vom Terminal aus ausführen
  • SIGTERM ist das Standardsignal, das von kill gesendet wird

Einige Signale sind ANSI C und andere nicht

Ein wesentlicher Unterschied besteht darin:

  • SIGINT und SIGTERM sind ANSI C, also besser portierbar
  • SIGQUIT und SIGKILL sind es nicht

Sie sind im Abschnitt "7.14 Signalhandhabung" des C99-Entwurfs N1256 beschrieben:

  • SIGINT Empfang eines interaktiven Aufmerksamkeitssignals
  • SIGTERM eine an das Programm gesendete Beendigungsanfrage

was SIGINT zu einem guten Kandidaten für ein interaktives Strg + C macht.

POSIX 7

POSIX 7 dokumentiert die Signale mit dem signal.h Header:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html

Diese Seite hat auch die folgende interessante Tabelle, die einige der Dinge erwähnt, die wir bereits in man 7 signal gesehen haben :

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 init

BusyBox 1.29.2 Standard reboot Der Befehl sendet ein SIGTERM an Prozesse, schläft für eine Sekunde und sendet dann SIGKILL. Dies scheint eine gemeinsame Konvention in verschiedenen Distributionen zu sein.

Beim Herunterfahren eines BusyBox-Systems mit:

reboot

es sendet ein Signal an den Init-Prozess.

Dann endet der Init-Signal-Handler mit dem Aufruf von:

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 */
}

die auf dem Terminal ausgibt:

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

Hier ist ein konkretes Minimalbeispiel dafür.

Vom Kernel gesendete Signale

  • SIGKILL:
    • OOM-Killer:Was ist RSS und VSZ in der Linux-Speicherverwaltung?

Linux
  1. Wie funktioniert das Sticky Bit?

  2. Der Zweck von .bashrc und wie funktioniert es?

  3. Linux – Woher kennt der Linux-Kernel Geräte-Major- und Minor-Nummern?

  4. Linux – Kann Strg+c das Sigint-Signal an mehrere Prozesse senden?

  5. So finden Sie heraus, welcher Prozess mysqld mit SIGKILL oder SIGTERM unter Linux zerstört

So finden Sie die Prozess-ID eines Programms und beenden es [Kurztipp]

SIGTERM vs. SIGKILL:Was ist der Unterschied?

So finden Sie die PID und PPID eines Prozesses in Linux

Wie erhalte ich die PID eines Prozesses und rufe im Shell-Skript kill -9 darauf auf?

Woher weiß die CPU, welche physikalische Adresse welcher virtuellen Adresse zugeordnet ist?

Wie behält Linux die Kontrolle über die CPU auf einem Single-Core-Rechner?