Comment tuer des processus depuis le terminal Linux



Il arrive parfois que la seule solution pour se débarrasser d’un programme récalcitrant soit de le stopper brutalement. Cette action, bien que portant un nom percutant, consiste simplement à forcer l’arrêt d’un processus. Découvrons ensemble comment réaliser cela via la ligne de commande sous Linux ou macOS.

Comprendre ce qu’est un processus

Un processus représente l’exécution d’un programme. Que ce soit votre navigateur web, les opérations en arrière-plan de votre environnement de bureau, ou encore les services système Linux, tous sont des processus.

On peut classer les processus en deux catégories :

Les processus de premier plan, initiés par un utilisateur, peuvent être des applications graphiques ou s’exécuter dans une fenêtre de terminal. Les processus d’arrière-plan, quant à eux, sont lancés automatiquement et n’interagissent pas directement avec l’utilisateur. Ils fonctionnent sans attendre de saisie et n’affichent pas de résultats visibles. Ces derniers regroupent les services et les démons.

En somme, si les processus de premier plan sont les acteurs sur scène, les processus d’arrière-plan sont l’équipe en coulisses.

Parfois, un processus peut mal fonctionner et monopoliser les ressources, comme le temps processeur ou la mémoire vive. Il peut aussi se bloquer dans une boucle de calcul et devenir non réactif. Les applications graphiques peuvent ignorer vos clics, tandis que les applications en ligne de commande peuvent ne jamais vous rendre l’invite.

Intervenir lorsque c’est nécessaire

L’action de « tuer » un processus consiste simplement à le forcer à s’arrêter, une mesure parfois indispensable si le processus devient inopérant.

Linux met à disposition les commandes kill, pkill et killall pour réaliser cette opération. Ces commandes sont utilisables sur tous les types de processus, qu’ils soient graphiques ou en ligne de commande, de premier plan ou en arrière-plan.

Utilisation de la commande kill

Pour utiliser la commande kill, il est nécessaire de connaître l’identifiant du processus, ou PID. La commande ps permet de trouver cet identifiant.

Pour que ps affiche l’ensemble des processus en cours, il faut utiliser l’option -e. Il est conseillé de rediriger la sortie vers la commande less, car la liste peut être longue. Saisissez donc : ps -e | less, puis validez.

ps -e | less

Une liste de processus, similaire à la capture d’écran ci-dessous, s’affichera. Vous pouvez naviguer dans cette liste avec les touches / (recherche avant) et ? (recherche arrière).

Pour cibler le processus qui vous intéresse, redirigez la sortie de ps via la commande grep, en spécifiant le nom (ou une partie du nom) du processus. Par exemple :

ps -e | grep shutter

Une fois le PID du processus cible identifié, transmettez-le à la commande kill. Pour stopper le processus ‘shutter’ identifié dans l’exemple précédent, utilisez :

kill 2099

La commande kill agit sans confirmation. Si l’opération réussit, elle ne vous fournit aucun message.

Utilisation de la commande pkill

La commande pkill vous permet de mettre fin à un ou plusieurs processus en spécifiant leur nom. L’utilisation du PID n’est pas nécessaire ici. Il suffit de fournir un terme de recherche, et pkill l’utilisera pour parcourir la liste des processus. Les processus correspondants seront stoppés. Il est donc important de bien orthographier le terme de recherche.

Par sécurité, vous pouvez utiliser la commande pgrep avant d’employer pkill. pgrep accepte également un terme de recherche et affiche le PID des processus correspondants. pgrep ne signale aucun arrêt, donc même en cas d’erreur, vous ne risquez pas de stopper un processus par inadvertance. Vous pouvez ainsi vérifier que le terme de recherche est correct avant de l’utiliser avec pkill. Le fonctionnement de pgrep et pkill est similaire, au point de partager la même page de manuel.

Prenons l’exemple d’un processus contenant « subq » dans son nom. Nous pouvons utiliser ps -u dave | grep pour visualiser le nom complet de ce processus et nous assurer que le terme « subq » correspond bien à ce seul processus.

ps -u dave | grep subq

Supposons que notre utilisateur ne connaisse qu’une partie du nom du processus, « subq ». Il peut utiliser pgrep pour vérifier qu’une seule correspondance existe, puis utiliser ce même terme de recherche avec pkill pour stopper le processus.

pgrep subq
pkill subq

La commande pkill peut servir à stopper plusieurs processus simultanément. Ici, l’utilisateur utilise pgrep pour vérifier le nombre de processus Chrome en cours d’exécution, puis il utilise pkill pour tous les arrêter. Il vérifie ensuite avec pgrep que tous ont bien été supprimés.

pgrep chrome
pkill chrome
pgrep chrome

Si plusieurs processus ont le même nom et que vous ne voulez pas tous les stopper, utilisez pgrep avec l’option -f (ligne de commande) pour identifier chaque processus. Par exemple, dans le cas de deux processus ‘ping’, vous pouvez cibler l’un en utilisant sa ligne de commande. Notez l’utilisation de guillemets pour encadrer le paramètre de la ligne de commande.

pgrep -f "ping 192.168.4.22"
pkill -f "ping 192.168.4.22"

Utilisation de la commande killall

Attention : Sur les systèmes Solaris et OpenIndiana, la commande killall stoppe tous les processus de l’utilisateur. Si vous êtes ‘root’ ou utilisez ‘sudo killall’, vous redémarrerez votre ordinateur ! Ce comportement a été confirmé lors des tests pour cet article avec la dernière version d’OpenIndiana Hipster 2018.10.

La commande killall fonctionne de manière similaire à pkill, mais une différence notable existe : au lieu de fournir un terme de recherche, il faut indiquer le nom exact du processus.

Il est impossible de fournir une correspondance partielle, le nom complet du processus est requis, comme le montre l’exemple :

killall shutt
killall shutter

L’option -y (plus jeune que) permet de stopper les processus exécutés depuis moins d’une durée spécifiée. La durée est exprimée par un nombre suivi d’une unité :

s (secondes), m (minutes), h (heures), d (jours), w (semaines), M (mois, notez la majuscule), y (années).

Pour stopper un processus nommé « ana » qui vient d’être lancé, et laisser les anciennes instances en cours, utilisez :

killall -y 2m ana

L’option -o (plus ancien que) permet d’arrêter les processus exécutés depuis plus longtemps que la durée spécifiée. Cette commande supprimera toutes les connexions SSH en cours depuis plus d’un jour :

killall -o 1d sshd

Agir avec prudence

Ces commandes vous permettent d’identifier et de stopper précisément les processus récalcitrants, en toute sécurité.

Soyez toujours prudent. Avant toute action, vérifiez que le processus que vous souhaitez arrêter est bien le bon. Double-vérifiez, soyez prudent et assurez-vous de bien cibler le bon processus. Ne l’arrêtez qu’après avoir vérifié toutes ces informations.