Comment gérer les processus Linux à l'aide de ps, kill et pkill
Tout ce qui s'exécute sur votre ordinateur Linux est un processus. Les processus doivent bien s’entendre avec les autres, mais ils doivent parfois être pris en main. Linux fournit les outils dont vous aurez besoin.
Sommaire
Processus et Linux
Les ordinateurs Linux utilisent un ensemble spécial de programmes et de systèmes de fichiers temporaires pour démarrer votre ordinateur jusqu'au point où le système d'exploitation peut être démarré. Le noyau crée ensuite le premier processus en espace utilisateur, en lançant le processus systemd.
Tous les processus reçoivent un numéro comme identifiant de processus, ou PID. Le processus systemd a un PID de un. Les processus peuvent lancer d'autres processus, appelés processus enfants. Le processus qui les a lancés est appelé processus parent. Tous les processus d'espace utilisateur réguliers exécutés sur votre ordinateur sont des descendants de systemd.
Si un processus est mal écrit ou est entré dans une condition d’erreur, il peut se bloquer et ne plus répondre, ou afficher un autre comportement indésirable. Si tel est le cas, vous devrez maîtriser ce processus, voire le tuer.
Ces commandes et utilitaires fournissent une boîte à outils complète pour gérer les processus.
La commande supérieure : un tableau de bord système dynamique
La commande top vous donne une vue dynamique des processus en cours d'exécution sur votre ordinateur. Chaque processus est affiché sous forme de ligne dans un tableau, avec des entrées de colonne représentant différentes statistiques sur ce processus. Le tableau est trié à nouveau à mesure que les valeurs changent.
Ctrl+Shift+M trie par la colonne %MEM et Shift+P trie par la colonne %CPU. Trier une colonne deux fois inverse l’ordre de tri. Cela vous permet de repérer rapidement les processus qui utilisent le plus de RAM ou de temps CPU.
Pour tuer un processus, appuyez sur « k » minuscule puis tapez le PID du processus que vous allez tuer. Lorsque vous êtes invité à donner le signal, entrez 9, puis appuyez sur Entrée.
La commande htop : un autre tableau de bord système dynamique
Le programme htop est top, rendu légèrement plus convivial. Vous pouvez avoir des couleurs et des graphiques en haut, mais les graphiques de htop sont plus configurables et l'utilisation de la couleur est une fonctionnalité de conception et non une réflexion après coup. Les colonnes sont les mêmes qu'en haut, sauf si vous les configurez différemment.
Pour tuer un processus dans htop, mettez le processus en surbrillance, appuyez sur « k » minuscule (ou F9), déplacez la surbrillance du menu sur SIGKILL et appuyez sur Entrée.
La commande ps : répertorier les processus à partir de la ligne de commande
La commande ps répertorie les processus dans une fenêtre de terminal et affiche leur PID. Par défaut, seuls les processus que vous avez lancés s'affichent. Pour voir tous les processus, utilisez l'option -e (tout).
ps
ps -e
Vous pouvez diriger la sortie via grep pour rechercher des processus par nom.
ps -e | grep firefox
L'option –forest formate la sortie dans une arborescence, ce qui facilite l'identification des processus enfants et parents. C'est utile car si vous tuez un parent, vous tuez également tous ses enfants.
ps -e
La commande pstree : un arbre plus attrayant
La commande pstree génère des arborescences de processus montrant les relations parent-enfant de manière structurée, compacte et informative.
Plusieurs enfants identiques sont affichés sous la forme d’une seule entrée avec le nom des processus enfants entre parenthèses.
parent-5*(child-processes)
Le nombre et l'astérisque « * » indiquent le nombre de processus enfants. Les accolades indiquent que les processus sont des threads. Dans ce cas, le nom affiché est le nom du processus parent.
parent-3*({name-of-parent})
Pour afficher les PID, utilisez l'option -p (afficher les PID).
pstree -p
Nous nous intéressons aux processus, pas aux threads. Masquez les threads avec l’option -T (masquer les threads) pour désencombrer l’arborescence.
pstree -p -T
Vous pouvez démarrer l'arborescence à n'importe quel processus, en fournissant son PID. Ici, nous demandons des PID, pas de threads, et démarrons l'arborescence avec le PID 14937.
pstree -pT 14937
La commande kill : vous êtes licencié
La commande kill termine le processus avec un PID particulier. Si vous ne possédez pas le processus, vous devrez utiliser sudo.
Dans l'exemple précédent, nous avons une fenêtre de terminal exécutant le shell Bash, qui a lancé un processus appelé drain.
Nous allons transmettre le PID de drain à tuer et y mettre fin.
kill 15197
pstree -pT 14937
Le processus de vidange a été interrompu.
La commande pgrep : les noms seront pris
Devoir trouver le PID d'un processus avant de le tuer fonctionne très bien, mais c'est un peu maladroit. La commande pkill saute une étape en acceptant un nom de processus au lieu d'un PID. Cependant, tous les processus de correspondance sont tués.
Si votre indice de recherche apparaît dans un autre nom de processus, cet autre processus sera également tué. Par exemple, utiliser « dbus » comme indice de recherche tue le processus dbus, ainsi que le processus dbus-daemon.
La commande pgrep vous indique quels processus correspondent à votre indice de recherche, mais elle laisse intacts les processus correspondants. Vous pouvez l'utiliser pour exécuter à sec votre commande pkill.
Disons que vous voulez tuer Firefox. Qu'est-ce qui serait tué si vous utilisiez « renard » comme indice de recherche ? L'option -l (liste des noms) indique à pgrep d'inclure le nom du processus dans la sortie.
pgrep -l fox
Dans notre cas, le processus appelé digitale serait également tué. Si nous recherchons « feu », nous ne ferions que tuer le processus Firefox.
pgrep -l fire
Les commandes pkill et killall : la liste des cibles
Pkill et killall acceptent tous deux un indice de recherche et tuent les processus de correspondance. La différence entre eux est que killall n'essaie pas de faire des correspondances partielles comme pkill et pgrep, il fonctionne uniquement avec des noms entiers.
pgrep -l fire
pkill fire
pgrep -l fire
Nous avons vérifié les processus avec « fire » dans leur nom et trouvé deux instances de Firefox. Nous les avons tués avec pkill et vérifié qu'ils étaient partis.
Le commandement renice : intégration sociale
Comme je l’ai dit plus tôt, les processus doivent bien s’entendre avec les autres. Le temps CPU est limité et doit être partagé. Mais certains processus sont critiques et méritent plus de temps CPU que les tâches moins prioritaires.
Tous les processus ont une belle valeur, entre -19 et 20. Le plus haut plus le nombre est élevé, plus le processus est agréable. Cela permet aux processus avec des nombres inférieurs d'être traités avant eux-mêmes.
Le inférieur plus le nombre est élevé, plus le processus est égocentrique. Il veut être traité avant les autres processus. Le processus moyen est lancé avec une belle valeur de zéro, ce qui signifie « traitez-moi comme tout le monde ».
La commande renice ajuste la belle valeur d'un processus. Nous fixerons une belle valeur de 15 sur le processus de vidange.
pgrep drain
renice 15 18577
Réduire la belle valeur nécessite sudo.
pgrep drain
renice 0 18577
sudo renice 0 18577
La commande xkill : pour X uniquement
La commande xkill ne fonctionne que sur GNOME, sur X. Elle ne fonctionne pas avec Wayland.
Si vous exécutez GNOME sur X, en tapant xkill dans une fenêtre de terminal, le curseur se transforme en un « x » ou un autre symbole tel qu'une tête de mort. La forme dépend de votre distribution.
Déplacer le curseur vers la fenêtre d'une application GNOME et cliquer avec le bouton gauche de la souris met fin à cette application.
Ces outils sont capables d’identifier et de tuer n’importe quel processus, alors soyez prudent !
Assurez-vous que le processus que vous êtes sur le point de tuer n'est pas un élément vital de votre système d'exploitation. Si vous le faites, rappelez-vous que supprimer une tâche ne la supprime pas de votre ordinateur, donc un redémarrage corrigera les erreurs. Mais cela reste un inconvénient, alors soyez-en sûr avant d'appuyer sur la gâchette.