Comment fermer un programme qui ne répond plus sous Linux en ligne de commande
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
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
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
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.
Commentaires
Laisser un commentaire