Signal

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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 fg ou bg)
  • Ctrl+\ — envoie SIGQUIT, termine le processus avec un core dump

Voir aussi

  • Ps — lister les processus pour trouver le PID à cibler
  • Kill — détail de la commande kill
  • Trap — piéger un signal dans un script shell