Signal
| Fiche express | |
|---|---|
| Domaine | Gestion des processus (signaux Unix) |
| Commandes | kill, killall, trap
|
| Contexte | Envoyer un signal à un processus, ou l'intercepter depuis un script |
| Voir aussi | Ps (lister les processus à cibler) |
Un signal est une notification asynchrone envoyée à un processus (par le noyau, par un autre processus, ou depuis le clavier) pour lui demander de réagir : se terminer, se suspendre, reprendre, ou exécuter un traitement particulier. Chaque signal a une action par défaut (le plus souvent terminer le processus), mais un programme peut l'intercepter via trap (en script shell) ou un gestionnaire de signal (dans son code) pour faire autre chose — sauf pour les deux signaux non interceptables SIGKILL et SIGSTOP.
Signaux courants
Numéros valables sur Linux x86/x86_64 (ils peuvent différer sur d'autres architectures ou d'autres Unix — vérifier avec kill -l sur la machine concernée).
| Signal | Numéro | Action par défaut | Usage typique |
|---|---|---|---|
| SIGHUP | 1 | Termine le processus | Terminal fermé ; par convention beaucoup de daemons rechargent leur configuration sur ce signal au lieu de quitter (kill -HUP)
|
| SIGINT | 2 | Termine le processus | Interruption clavier (Ctrl+C) |
| SIGQUIT | 3 | Termine le processus + dump core | Interruption clavier (Ctrl+\) |
| SIGKILL | 9 | Termine le processus | Non interceptable, non ignorable — arrêt forcé immédiat, dernier recours quand SIGTERM ne suffit pas |
| SIGUSR1 | 10 | Termine le processus | Signal libre laissé à l'application (reload de config, rotation de logs, etc.) |
| SIGUSR2 | 12 | Termine le processus | Idem, second signal libre |
| SIGALRM | 14 | Termine le processus | Envoyé par le noyau à l'expiration d'un minuteur posé avec alarm()
|
| SIGTERM | 15 | Termine le processus | Signal par défaut de kill, interceptable — laisse au processus l'occasion de se terminer proprement
|
| SIGCHLD | 17 | Ignoré | Envoyé au parent quand un processus fils se termine ou change d'état |
| SIGCONT | 18 | Reprend le processus | Relance un processus stoppé (utilisé par bg/fg)
|
| SIGSTOP | 19 | Stoppe le processus | Non interceptable — met en pause immédiatement |
| SIGTSTP | 20 | Stoppe le processus | Interruption clavier (Ctrl+Z), interceptable contrairement à SIGSTOP |
Envoyer un signal
kill PID # envoie SIGTERM (15) par défaut
kill -9 PID # SIGKILL, arrêt forcé
kill -HUP PID # par nom de signal
kill -SIGTERM PID # forme équivalente
kill -l # liste tous les signaux disponibles sur le système
killall nginx # cible par nom de processus plutôt que par PID
killall -9 nginx # idem, en forçant
killall -HUP nginx # ex. classique pour recharger la config d'un daemon
kill ne "tue" pas forcément le processus au sens strict : par défaut il envoie SIGTERM, que le processus peut intercepter pour se terminer proprement (fermer ses fichiers, ses connexions, etc.) ; seul SIGKILL garantit un arrêt immédiat et inconditionnel.
Piéger un signal avec trap
Dans un script shell, la commande interne trap permet d'intercepter un signal pour exécuter une commande à la place de l'action par défaut :
#!/bin/bash
# nettoyage propre avant de quitter sur Ctrl+C ou kill
trap 'echo "Signal reçu, nettoyage en cours..."; exit 1' SIGINT SIGTERM
echo "pid $$"
while true; do
sleep 60
done
Ici, un Ctrl+C (SIGINT) ou un kill classique (SIGTERM) affiche le message et sort proprement au lieu de laisser l'action par défaut (terminaison brute) s'appliquer. trap accepte aussi le pseudo-signal EXIT, déclenché à toute sortie du script (utile pour du nettoyage garanti), et DEBUG, déclenché avant chaque commande (pratique pour tracer une variable).
Raccourcis clavier
- Ctrl+C — envoie SIGINT au job au premier plan (interruption)
- Ctrl+Z — envoie SIGTSTP, suspend le processus et rend la main au shell (reprendre ensuite avec
fgoubg) - Ctrl+\ — envoie SIGQUIT, termine le processus avec un core dump