SIGTERM et SIGKILL sont destinés à des requêtes générales "terminer ce processus". SIGTERM (par défaut) et SIGKILL (toujours) provoqueront l'arrêt du processus. SIGTERM peut être capturé par le processus (par exemple pour qu'il puisse faire son propre nettoyage s'il le souhaite), ou même être complètement ignoré ; mais SIGKILL ne peut pas être attrapé ou ignoré.
SIGINT et SIGQUIT sont destinés spécifiquement aux requêtes du terminal :des caractères d'entrée particuliers peuvent être affectés pour générer ces signaux (selon les paramètres de contrôle du terminal). L'action par défaut pour SIGINT est le même type de fin de processus que l'action par défaut pour SIGTERM et l'action non modifiable pour SIGKILL ; l'action par défaut pour SIGQUIT est également l'arrêt du processus, mais des actions supplémentaires définies par l'implémentation peuvent se produire, telles que la génération d'un vidage mémoire. L'un ou l'autre peut être intercepté ou ignoré par le processus si nécessaire.
SIGHUP, comme vous le dites, est destiné à indiquer que la connexion au terminal a été perdue, plutôt qu'à être un signal de terminaison en tant que tel. Mais, encore une fois, l'action par défaut pour SIGHUP (si le processus ne l'attrape pas ou ne l'ignore pas) est de terminer le processus de la même manière que SIGTERM etc.
Il y a un tableau dans les définitions POSIX pour signal.h
qui répertorie les différents signaux et leurs actions et objectifs par défaut, et le chapitre Interface générale du terminal comprend beaucoup plus de détails sur les signaux liés au terminal.
Comme l'a noté DarkDust, de nombreux signaux ont les mêmes résultats, mais les processus peuvent leur associer différentes actions en distinguant la manière dont chaque signal est généré. En regardant le code source du noyau FreeBSD (kern_sig.c), je vois que les deux signaux sont gérés de la même manière, ils terminent le processus et sont livrés à n'importe quel thread.
SA_KILL|SA_PROC, /* SIGINT */
SA_KILL|SA_PROC, /* SIGTERM */
man 7 signal
Il s'agit de la page de manuel non normative pratique du projet de pages de manuel Linux que vous souhaitez souvent consulter pour obtenir des informations sur les signaux Linux.
La version 3.22 mentionne des choses intéressantes telles que :
Les signaux SIGKILL et SIGSTOP ne peuvent pas être interceptés, bloqués ou ignorés.
et contient le tableau :
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
qui résume le signal Action
qui distingue par ex. SIGQUIT de SIGQUIT, puisque SIGQUIT a l'action Core
et SIGINT Term
.
Les actions sont documentées dans le même document :
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.
Je ne vois aucune différence entre SIGTERM et SIGINT du point de vue du noyau puisque les deux ont l'action Term
et les deux peuvent être attrapés. Il semble que ce ne soit qu'une "distinction de convention d'utilisation courante":
- SIGINT est ce qui se passe lorsque vous faites CTRL-C depuis le terminal
- SIGTERM est le signal par défaut envoyé par
kill
Certains signaux sont ANSI C et d'autres non
Une différence considérable est que :
- SIGINT et SIGTERM sont ANSI C, donc plus portables
- SIGQUIT et SIGKILL ne le sont pas
Ils sont décrits à la section "7.14 Signal handling" du C99 draft N1256 :
- SIGINT réception d'un signal d'attention interactif
- SIGTERM une demande de résiliation envoyée au programme
ce qui fait de SIGINT un bon candidat pour un Ctrl + C interactif.
POSIX 7
POSIX 7 documente les signaux avec le signal.h
en-tête :https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
Cette page contient également le tableau d'intérêt suivant qui mentionne certaines des choses que nous avions déjà vues en 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.
Initiation BusyBox
reboot
par défaut de BusyBox 1.29.2 La commande envoie un SIGTERM aux processus, se met en veille pendant une seconde, puis envoie SIGKILL. Cela semble être une convention commune à différentes distributions.
Lorsque vous éteignez un système BusyBox avec :
reboot
il envoie un signal au processus init.
Ensuite, le gestionnaire de signal init finit par appeler :
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 */
}
qui imprime sur le terminal :
The system is going down NOW!
Sent SIGTERM to all processes
Sent SIGKILL to all processes
En voici un exemple concret minimal.
Signaux envoyés par le noyau
- SIGKILL :
- OOM killer :qu'est-ce que RSS et VSZ dans la gestion de la mémoire Linux ?