Kill

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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()).

Voir aussi

  • Signal — détail des signaux (numéros, action par défaut, interception avec trap)
  • Ps — lister les processus et repérer un PID ou un état (ex. zombie) avant d'envoyer un signal
  • Lsof — lister les fichiers ouverts par un processus ou un utilisateur