Comment fermer un programme qui ne répond plus sous Linux en ligne de commande

Par Julien Roland , le 08/06/2020 , mis à jour le 06/02/2022 - 6 minutes de lecture
la commande kill

La gestion des processus dans un système d’exploitation est un vaste sujet, faisant l’objet de milliers de pages dans la littérature technique. Par ailleurs, c’est un sujet qui est orienté vers un public très expert. Aussi, il ne sera pas question ici de faire un exposé dessus, mais seulement de montrer très rapidement, par l’exemple, comment fermer un programme qui ne répond plus sous Linux en ligne de commande. Cet article vient compléter l’excellent article sur les méthodes pour fermer un programme récalcitrant  rédigé précédemment par Steve.
La commande qui sera exposée ici est la commande kill. que vous pourrez utiliser avec toutes les distributions Linux.

kill ne porte pas toujours exactement bien son nom

En effet, bien qu’elle soit utilisée également (et principalement) pour ça comme nous le verrons plus loin, la commande kill ne sert pas uniquement à fermer autoritairement un processus récalcitrant. Elle sait faire bien plus.
En fait, la fonction de base de la commande kill est d’envoyer un message (un signal) à un processus en cours d’exécution. Ces signaux peuvent être de différentes natures, et on peut même en créer des personnalisés. La variété des signaux existants de base suffit à montrer la complexité du sujet, mais on pourra évoquer parmi ceux-ci la mise en pause et en arrière plan d’un process (signal 19 = SIGSTOP ainsi que son raccourci clavier CTRL-Z).

kill sert quand même majoritairement à fermer des processus

Sinon il est probable qu’on aurait choisi un autre nom de commande…

De manière polie

Comme on le sait à présent, kill envoie un signal à un processus. Le signal par défaut envoyé par kill est le signal 15, ou SIGTERM. Celui-ci demande au processus de se terminer proprement, c’est-à-dire de prendre le temps de finir le traitement en cours et de libérer lui-même les ressources utilisées avant d’invoquer l’arrêt (c’est un peu plus complexe que cela en réalité, car entre autres le processus parent du processus à fermer joue un rôle dans la procédure). C’est ce signal qui est envoyé par exemple quand on clique sur la petite croix pour fermer la fenêtre d’un logiciel, ou qu’on invoque la commande kill sans préciser le signal à envoyer. Il est à noter qu’un processus peut faire le choix d’ignorer ce signal, même s’il n’est pas planté.

Autoritairement : comment fermer un programme qui ne répond plus sous Linux en ligne de commande

Il y a des cas où un programme ou un processus ne répond plus aux commandes de contrôle que le système d’exploitation lui envoie. On dit couramment qu’il est « planté ». Dans ces cas là, on invoquera le signal 9 (SIGKILL) de la commande kill. Cette fois-ci, ce n’est pas le processus lui-même qui recevra le signal (il ne peut pas de toute façon car il est planté), mais c’est l’ordonnanceur du noyau Linux qui le recevra. Ce faisant, c’est lui-même qui prendra en charge la terminaison du programme ne répondant plus, de manière administrative et autoritaire. Les ressources système consommées par le processus planté seront alors libérées sans précautions (par exemple des données en mémoire ne seront pas consolidées dans le disque dur).

Quelques exemples

Exemples de kill, nécessitant de connaître le numéro de processus

La commande kill nécessite qu’on lui précise le PID du processus à terminer (le PID = Process IDentifier, est le numéro de processus que l’ordonnanceur du noyau lui a assigné). On peut obtenir ce PID en saisissant la commande ps qui liste les processus en cours, en filtrant (à l’aide de la commande grep) par le nom du programme exécuté.

ps aux | grep -v grep| grep thunderbird

la commande ps aux
La commande ps, avec les options “aux” qui permet de lister les processus en cours d’exécution. Ici on a filtré sur le nom thunderbird avec la commande grep.

Le PID du processus est affiché sur la 2e colonne. Dans notre exemple, il a pour valeur 2337.
Pour terminer proprement le processus, on saisira la commande suivante :

kill 2337

Toutefois, si on en est là, c’est probablement que notre programme (ici thunderbird) ne répond plus, et que nous n’arrivons pas à le fermer en cliquant sur la croix de sa fenêtre. Dans ce cas, on saisira la commande suivante :

kill -9 2337

la commande kill
Envoi du signal SIGKILL (-9) avec la commande kill pour terminer autoritairement un processus qui ne répond plus.

Cette commande envoie le signal SIGKILL qui demandera à l’ordonnanceur du noyau Linux de terminer le programme récalcitrant.

Une méthode pour éviter de déterminer le numéro de processus avant de fermer un programme qui ne répond plus sous Linux en ligne de commande

La commande killall a pour objet d’envoyer un signal comme le fait kill, mais cette fois-ci elle ne vise pas un numéro de processus: elle cible tous les processus exécutant une commande donnée. En outre, on notera que comme pour la commande kill, on lui fournira un numéro de signal à envoyer.

killall thunderbird

La commande ci-dessus aura pour effet de terminer proprement tous les processus qui exécutent le programme thunderbird.

Si le programme récalcitre, on pourra comme avec kill envoyer le signal SIGKILL en saisissant la commande suivante :

killall -9 thunderbird
la commande killall
Envoi du signal SIGKILL (-9) avec la commande killall qui terminera autoritairement TOUS les processus exécutant la commande thunderbird.

Attention toutefois, même si la commande killall est pratique car il n’y a pas à déterminer le numéro du processus à killer, elle peut avoir des effets indésirables. En effet, son utilisation sera au prix du risque de terminer brutalement des processus qui eux n’étaient pas plantés, puisque killall envoie le signal à tous les processus exécutant un programme donné.
Ceci dit, dans notre exemple avec thunderbird, il n’y a pas de souci, car thunderbird est fait pour être exécuté par un seul processus. Ce n’est pas toujours le cas, notamment avec des programmes serveurs, qui peuvent être configurés pour multiplier les processus à mesure que la charge augmente.

Tux, la mascotte du noyau Linux. (c) Larry Ewing

Julien Roland

Technicien systèmes et réseaux depuis plus de 15 ans, je travaille au sein des infrastructures informatiques d'une entité de plusieurs milliers d'utilisateurs. Convaincu du fait qu'il existe des produits d'excellence à la fois issus du monde propriétaire et du monde open source, j'aime butiner dans les deux. Cependant j'ai une appétence particulière pour les logiciels libres de par leur esprit d'universalité et de partage. Mes contributions passent par le partage et la transmission des mes connaissances et expériences, mais aussi par l'aide et le conseil que je peux apporter autour de moi.

Voir les publications de l'auteur

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.