Linux / Commande kill : envoyer un signal à un PID et vérifier la fin

kill envoie un signal à un processus désigné par son identifiant PID, ou à une tâche du shell lorsque le contrôle des tâches le permet. Sans signal explicite, Bash envoie SIGTERM, une demande de terminaison. Le programme peut traiter cette demande : envoyer un signal ne garantit donc pas un arrêt immédiat.

Vérifier le PID et l'implémentation

kill [-signal] PID…

Dans Bash, kill est une commande interne ; un exécutable externe du même nom peut aussi être installé. Vérifiez ce que votre shell utilise et consultez son aide :

type kill
help kill
kill -l

kill -l affiche les noms de signaux. Pour un processus déjà identifié, inspectez d'abord son utilisateur, son état et sa commande avec ps :

ps -p 1234 -o pid,user,stat,cmd

1234 est un numéro d'exemple, à remplacer par un PID que vous avez vérifié. Un numéro ancien peut être réutilisé par une autre tâche. Les exemples de cette page concernent un PID strictement positif : 0 et les identifiants négatifs ont des significations de sélection plus larges et ne doivent pas remplacer un numéro manquant.

Essayer sur un enfant créé dans le même shell

Dans un terminal Bash, lancez une attente de 120 secondes en arrière-plan. Cette tâche ne traite aucun fichier ; $! permet d'enregistrer immédiatement son PID :

sleep 120 &
demo_pid=$!
printf 'PID créé : %s\n' "$demo_pid"
ps -p "$demo_pid" -o pid,stat,comm

La dernière ligne doit identifier le sleep que vous venez de lancer. Confirmez le PID et la commande avant de continuer. Si le processus a déjà fini, recommencez la création plutôt que de réutiliser son ancien numéro.

Envoyez ensuite TERM uniquement au PID enregistré, puis attendez la fin de cet enfant :

kill -TERM "$demo_pid"
kill_status=$?
printf 'Code de kill : %s\n' "$kill_status"
wait "$demo_pid"
wait_status=$?
printf 'Code de wait : %s\n' "$wait_status"
ps -p "$demo_pid" -o pid,stat,comm

Kill réussit normalement sans texte et son code vaut 0 pour cet envoi réussi. Le processus sleep se termine ; wait récupère son état et peut renvoyer un code supérieur à 128 parce que l'enfant a été terminé par un signal. Bash peut aussi afficher un message de terminaison.

La dernière consultation ps ne doit plus afficher la ligne du sleep terminé. Le code de wait et l'absence de cette ligne apportent une vérification supplémentaire : le silence de kill, à lui seul, ne démontrait pas que l'arrêt était achevé. Pour refaire l'exercice, créez un nouveau sleep et relevez son nouveau PID.

Choisir le signal selon le programme

Forme Sens
-TERM Demande de terminaison, signal par défaut. Un programme peut la traiter pour effectuer son nettoyage.
-INT Signal d'interruption, également utilisé par le terminal pour son groupe au premier plan lors de Ctrl+C.
-HUP Signal de perte de connexion ; certaines applications lui donnent une fonction particulière, comme une relecture de configuration.
-KILL Terminaison forcée que le programme ne peut ni intercepter ni ignorer pour exécuter son nettoyage.
-0 Contrôle d'existence et de permission, sans envoyer de signal.

Ne supposez pas que HUP recharge tous les programmes : vérifiez la documentation du service. Avant une terminaison forcée, examinez l'état, les journaux et le délai nécessaire à une fermeture normale. Pour un service administré, privilégiez sa procédure d'arrêt prévue ; son gestionnaire peut sinon le redémarrer.

Interpréter un refus ou un processus encore visible

kill -0 PID ne teste pas que l'application répond correctement. Un échec peut signifier que le PID n'existe plus ou que vous n'avez pas la permission de le signaler. Un succès ne prouve pas non plus une application active et saine : un processus terminé dont l'état n'a pas encore été récupéré peut encore exister comme zombie.

Si une tâche reste visible après TERM, elle peut être en cours de fermeture, ignorer ou traiter le signal, ou être limitée par son état d'attente. Contrôlez de nouveau son identité et son état avec ps, puis les journaux concernés. Ne multipliez pas les signaux vers un numéro sans confirmer qu'il représente toujours la même tâche.

Le manuel des commandes de contrôle des tâches de Bash décrit kill et wait. La page Linux kill(2) précise les contrôles d'existence, les permissions et les sélections de processus.