Exercice - Terminer un processus anormal

Effectué

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.

  1. Revenez à votre point d’origine en tapant la commande suivante :

    cd ~
    
  2. 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 de vi.

  3. 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.

  4. 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 » et q « quit ».

  5. 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.

  1. 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
    
  2. 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ée killall tue un processus d’après son nom.) Quand vous appelez kill, 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
    
  3. 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 de ps -ef (dans la deuxième colonne) et utilisez la commande suivante pour terminer le processus. Remplacez PROCESS_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.

  4. 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.