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?