Tuer un processus sous Linux : kill, killall et pkill

Qu'avons-nous dans la boîte ?
Imaginez un instant, vous avez passé une excellente journée à travailler sur votre machine Linux, et soudain, un processus commence à ralentir l’ensemble du système. Vous l’avez identifié et vous souhaitez arrêter son exécution, mais comment tuer un processus en ligne de commande sous Linux ?
Si le processus s’exécute au premier plan, vous pouvez utiliser le raccourci terminal « Ctrl+C » pour l’arrêter directement. Toutefois, si le processus n’est pas visible, car il s’exécute en arrière-plan, et que vous l’avez repéré après avoir exécuté la commande « top », par exemple, vous pouvez utiliser des commandes dédiées pour le « tuer ».
En fait, le terme « tuer un processus » fait référence à l’arrêt d’un processus en cours d’exécution. Si vous connaissez l’ID du processus (PID), vous pouvez utiliser la commande kill comme suit :
kill <signal> <PID>
Dans la syntaxe de la commande ci-dessus, le bloc « signal » fait référence au signal d’arrêt que vous souhaitez envoyer pour mettre fin au processus et le bloc « PID » fait référence à l’ID du processus.
Il existe d’autres commandes alternatives à la commande kill, donc dans cet article je vais évoquer plusieurs solutions pour tuer un processus, notamment avec la commande killall.
1. Les signaux dans Linux
Tout d’abord, commençons par regarder de plus près les signaux de fin de Linux. Lorsqu’un processus est terminé par le système d’exploitation ou par l’utilisateur, c’est-à-dire que le processus ne s’est pas terminé naturellement (tout seul), il reçoit un signal de fin de la part du système.
Voici les signaux disponibles :
- SIGHUP – Signal Hangup
Envoyé à un processus lorsque le terminal qui le contrôle est fermé.
Associé à la valeur numérique « 1 ».
- SIGINT – Signal Interrupt
Le signal envoyé à un processus lorsqu’un utilisateur met fin à un processus (par exemple, Ctrl + C)
Associé à la valeur numérique « 2 ».
- SIGKILL – Signal Kill
Le signal qui quitte immédiatement un processus, sans lui permettre de sauvegarder son état actuel.
Associé à la valeur numérique « 9 ».
- SIGTERM – Signal Terminate
Signal envoyé pour demander la fin du processus. Ce signal peut être ignoré par un processus, mais c’est la meilleure façon de mettre fin à un processus car il peut libérer les ressources lorsque le processus reçoit SIGTERM.
Associé à la valeur numérique « 15 ».
- SIGSTOP – Signal Stop
Signal permettant d’arrêter un processus, mais devant être repris ultérieurement.
Associé à la valeur numérique « 19 » sur la majorité des machines, ou d’autres valeurs sur des machines spécifiques (17, 23 et 24).
Dans la pratique, il est fort probable que vous utilisiez les signaux 9 et 15. Avant de passer à l’utilisation des commandes, voyons comment obtenir le PID d’un processus.
2. Obtenir le PID d’un processus
Vous devez également connaître un minimum d’informations sur le processus que vous souhaitez tuer. Comment tuer un processus s’il n’est pas identifié avant ? Difficile, vous allez me dire, d’autant plus qu’avec la commande kill, vous devez fournir l’identifiant d’un processus (PID).
Vous pouvez obtenir le PID à partir du nom du processus :
pidof <nom du processus>
3. Tuer un processus dans la ligne de commande Linux
Voyons d’abord la commande kill car vous l’utiliserez plus que la commande killall, qui reste intéressante malgré tout.
A. Utilisation de la commande kill
La commande kill nécessite que vous connaissiez l’ID d’un processus que vous voulez tuer et, éventuellement, le signal de fin.
Pour tuer un processus simplement, utilisez la syntaxe suivante :
kill <signal> <PID>
L’envoi d’un signal de fin à un PID est facultatif, et si aucun signal n’est fourni, kill envoie par défaut SIGTERM (15). Autrement dit, on peut utiliser cette syntaxe :
kill <PID>
Prenons un exemple… J’ai lancé un processus en arrière-plan avec la commande sleep afin d’attendre 120 secondes, et en l’exécutant en tâche de fond ce qui va permettre d’avoir le PID (&). Nous allons essayer de tuer ce processus.
sleep 120 &
[1] 46532
Compte tenu du retour de la commande ci-dessus, je sais que mon processus dispose de l’ID « 46532 », donc pour le tuer, je dois faire :
kill 46532

Si je voulais utiliser un signal de fin spécifique pour mettre fin à ce processus, je pourrais utiliser soit la valeur numérique correspondante à ce signal, soit le nom du signal directement. Voici un exemple dans le même esprit que le précédent :
sleep 120 &
[1] 46532
Ce qui donne pour tuer le processus :
kill -SIGKILL 46532
Dans le cas où l’on utilise la valeur numérique, il faut utiliser cette syntaxe :
kill -9 46532
Ce n’est pas toujours utile de préciser un type de signal car par défaut, si vous ne précisez rien, la commande kill va utiliser SIGTERM (15).
B. Utilisation de la commande killall
Si vous ne savez pas quel est le PID d’un processus, ou si ledit processus a plusieurs processus enfants, et que vous voulez tuer les processus enfants et le processus parent en même temps, vous pouvez utiliser la commande killall. Elle s’utilise sur un principe similaire à la commande kill, la commande principale pour tuer un processus Linux :
killall <signal> <nom du processus>
Comme pour la commande kill, la spécification d’un signal de fin est facultative. Lorsqu’aucun signal de fin n’est spécifié, killall enverra SIGTERM (15) pour arrêter le processus en question, comme le fait la commande kill.
Reprenons le même exemple que précédemment basé sur « sleep », sauf que cette fois-ci je veux tuer deux commandes sleep en cours d’exécution.
$ sleep 60 &
[1] 46536
$ sleep 120 &
[2] 46537
Pour tuer ces deux processus « sleep » avec killall, cela donne :
$ killall sleep
[1]- Terminé sleep 60
[2]+ Terminé sleep 120
En image, voici ce que ça donne avec ce même exemple :

C. Utilisation de la commande pkill
Une commande alternative à kill est la commande pkill, capable aussi de tuer un processus Linux. En fait, il s’agit d’une sorte de combinaison des commandes pgrep et kill. La commande killall tue tous les processus qui ont un nom correspondant. D’un autre côté, pkill utilise le principe de correspondance via des patterns pour faire correspondre les processus et les tuer.
L’avantage de la commande pkill, c’est qu’elle de tuer un processus simplement avec son nom, à la place du PID.
Voici la syntaxe :
pkill <options> pattern
Quelques options utiles disponibles dans la commande pkill sont les suivantes :
- -u : processus appartenant à un propriétaire particulier
- -x : processus qui correspondent exactement au pattern
- -signal : spécifier un signal de terminaison (par défaut SIGTERM)
Ce pattern peut être simplement le nom du processus, ce qui donnerait la commande ci-dessous, si l’on reprend l’exemple précédent.
pkill sleep
Puisque pkill repose sur le principe de correspondance, la commande ci-dessous tue également le processus « sleep » :
pkill slee
La commande pkill est intéressante, mais elle doit être utilisée avec précaution !
4. Conclusion
Avec cet article de la boîte à tutoriels informatique, vous avez appris 3 commandes différentes pour tuer un processus sous Linux. Personnellement, j’utilise surtout la commande « kill », ou éventuellement « killall ».
Ressources :