Kill
| Fiche express | |
|---|---|
| Domaine | Gestion des processus (arrêt, envoi de signaux) |
| Commandes | kill, killall, pkill
|
| Contexte | Cibler un PID (kill) ou un nom de processus (killall, pkill)
|
| Voir aussi | Signal (détail des signaux), Ps (trouver le PID) |
kill envoie un signal à un ou plusieurs processus, identifiés par leur PID. Par défaut il envoie SIGTERM (15), que le processus peut intercepter pour se terminer proprement — ce n'est donc pas forcément une terminaison brutale ; pour un arrêt inconditionnel il faut SIGKILL (kill -9). killall et pkill font la même chose mais ciblent un ou plusieurs processus par nom plutôt que par PID, ce qui évite d'avoir à chercher le PID au préalable avec Ps. Le détail des signaux disponibles (numéros, action par défaut, interception) est couvert dans Signal — cette page se concentre sur l'usage des commandes elles-mêmes.
Cibler un PID
kill PID # SIGTERM par défaut
kill -9 PID # SIGKILL, arrêt forcé et inconditionnel
kill -HUP PID # demande de rechargement de configuration (convention courante)
kill -l # liste tous les signaux disponibles sur le système
Cibler par nom de processus
killall nginx # tous les processus nommés exactement "nginx"
killall -9 nginx # idem, en forçant
killall -HUP nginx # ex. classique pour recharger la config d'un daemon
pkill -f perl # tous les processus dont la ligne de commande contient "perl"
pkill -9 -u tecmint # tous les processus de l'utilisateur tecmint, en forçant
killall ne fait correspondre que le nom exact du binaire (colonne comm), alors que pkill -f fait correspondre n'importe où dans la ligne de commande complète — utile pour cibler un script lancé via un interpréteur (perl monscript.pl) là où le nom du processus lui-même est juste perl.
L'ancienne méthode ps / grep / awk
Avant l'usage courant de pkill, il était fréquent de reconstruire la liste des PID à la main :
kill -9 $(ps -ef | grep perl | grep -v grep | awk '{print $2}')
Le grep -v grep sert à exclure la ligne du grep lui-même de sa propre recherche. Cette construction fonctionne toujours, mais pkill -f perl fait exactement la même chose en une seule commande, sans ce piège.
Tuer tous les processus d'un utilisateur
pkill -9 -u tecmint # méthode directe, recommandée
kill -9 $(pgrep -u tecmint) # équivalent explicite
kill -9 $(lsof -t -u tecmint) # variante historique, via lsof
La variante lsof -t -u user liste les PID des processus qui ont au moins un fichier ouvert appartenant à cet utilisateur — proche du résultat recherché mais indirect (voir Lsof) ; pkill -u/pgrep -u filtrent directement sur le propriétaire du processus et sont plus fiables.
Cas des processus zombies (defunct)
Un processus affiché en état Z (« defunct » dans ps aux) est déjà terminé : il ne fait qu'attendre que son parent lise son code de sortie (wait()). Il n'a donc plus de code à exécuter et kill, même -9, n'a aucun effet sur lui :
ps aux | grep defunct # repérer les zombies (colonne STAT = Z)
Pour les faire disparaître, il faut agir sur le parent plutôt que sur le zombie lui-même : soit il finit par appeler wait() de lui-même, soit on le force à le faire en lui envoyant SIGCHLD, soit en dernier recours on le termine (le zombie est alors adopté par init/systemd, qui le récupère immédiatement). Un grand nombre de zombies persistants est généralement le signe d'un bug dans le processus parent (mauvaise gestion de SIGCHLD/wait()).