Exercice - Terminer un processus anormal
Les ordinateurs ne sont pas parfaits. Tôt ou tard, vous allez être confronté à des problèmes. C’est d’ailleurs ce qui justifie votre poste d’administrateur système : c’est à vous de détecter et de résoudre les problèmes liés au système.
Imaginons qu’une application Python vous cause des ennuis. Il est possible qu’elle consomme trop de temps processeur ou qu’elle ne réponde plus. Dans les deux cas, vous souhaitez arrêter l’application. Pour identifier un processus ou une application, vous pouvez utiliser ps
et grep
. Puis, pour l’arrêter, vous pouvez utiliser la commande kill
. Essayons cela dans votre machine virtuelle Linux.
Démarrer un processus anormal
Si vous envisagez de tuer un processus, vous avez besoin d’un processus à tuer ! Créons-en un.
Revenez à votre point d’origine en tapant la commande suivante :
cd ~
Dans Azure Cloud Shell, entrez la commande suivante pour démarrer l’éditeur de
vi
de Linux :vi bad.py
vi
est un éditeur de texte largement utilisé que Linux a hérité d’Unix. Que cela vous plaise ou non, tout utilisateur de Bash doit connaître les principes de base devi
.Sélectionnez la touche i pour faire entrer
vi
en mode d’insertion. Tapez ensuite le programme Python suivant :i = 0 while i == 0: pass
Une fois lancé, ce programme s’exécute dans une boucle infinie, ce qui n’est manifestement pas souhaitable sur votre serveur.
Sélectionnez la touche Échap pour sortir du mode d’insertion. Ensuite, tapez la commande suivante et appuyez sur la touche Entrée pour enregistrer le programme et quitter
vi
::wq
Veillez à inclure le signe deux-points au début de la commande. En ce qui concerne le reste de la commande,
w
signifie « write » etq
« quit ».Utilisez maintenant la commande suivante pour démarrer le programme et laissez-le s’exécuter en arrière-plan :
python3 bad.py &
Veillez à inclure l’esperluette (
&
) à la fin de la commande. Sinon, vous ne pourrez pas revenir à l’invite Bash. Dans Bash, l’esperluette exécute une commande et retourne à la ligne de commande, même si la commande n’a pas fini de s’exécuter.
Ce n’est pas évident, mais bad.py s’exécute maintenant en arrière-plan et vole les cycles processeur d’autres processus. Examinons de plus près ce qui se passe.
Tuer le processus
Pour tuer un processus, vous avez besoin du nom ou de l’ID du processus. C’est un travail pour ps
.
Pour actualiser votre mémoire, une commande
ps -ef
liste tous les processus en cours d’exécution et affiche quantité d’informations sur chacun d’eux. Utilisez la commande suivante pour lister tous les processus en cours d’exécution et filtrer les résultats afin d’afficher uniquement les lignes contenant « Python » :ps -ef | grep python
Les résultats doivent ressembler à ceci :
yourname+ 342 254 99 23:34 pts/1 00:00:31 python3 bad.py yourname+ 344 254 0 23:35 pts/1 00:00:00 grep --color=auto python
Dans la liste, il semble que bad.py consomme 99 % du temps processeur du serveur. Le programme porte bien son nom.
La commande
kill
tue un processus en cours d’exécution d’après son ID. (Une commande connexe nomméekillall
tue un processus d’après son nom.) Quand vous appelezkill
, vous devez déterminer le type de « signal » à utiliser pour tuer le processus. Utilisez la commande suivante pour afficher une liste de types de signaux :kill -l
Si vous tuez un processus démon (qui s’exécute en arrière-plan et fournit des services vitaux au système d’exploitation), tuez-le et redémarrez-le immédiatement. Pour ce faire, vous pouvez utiliser un signal
SIGHUP
.Dans cet exemple, vous souhaitez tuer le processus sans le redémarrer. Utilisez donc le signal
SIGKILL
, qui correspond au chiffre 9. Pour cela, saisissez l’ID de processus de bad.py à partir de la sortie deps -ef
(dans la deuxième colonne) et utilisez la commande suivante pour terminer le processus. RemplacezPROCESS_ID
par l’ID de processus.kill -9 PROCESS_ID
Vous pouvez également entrer la même commande, comme ceci :
kill -s SIGKILL PROCESS_ID
. La décision d’utiliser le nom ou le numéro d’un signal vous appartient.Pour terminer, réexécutez
ps
pour confirmer que bad.py n’est plus exécuté.
ps
et kill
sont aussi couramment utilisés pour identifier les « processus zombies » (des processus enfants abandonnés par des programmes mal écrits) et les terminer.