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.