Formation PUB420 : Système domotique DIY, 2020 Scripts Python pour interagir avec le GPIO

9.4 Forcer l'arrêt d'un script


Quand vous lancez un script, que ce soit un script bash ou un script Python, il pourrait arriver une situation où vous devez en forcer l'arrêt, par exemple si le script entre dans une boucle sans fin.

▼Publicité Le texte se poursuit plus bas

Ctrl+C

La façon la plus intéressante pour terminer un programme est d'appuyez sur les touches Ctrl+C. Ceci émet un signal SIGINT qui arrête gentiment le programme.

Dans le cas d'un script Python, SIGINT lève une exception de type KeyboardInterrupt qui interrompt le code et qui peut être attrrapée et traitée au même titre que toute autre exception.

Ctrl+Z

Dans le cas où Ctrl+C ne fonctionne pas, on peut se tourner vers une action un peu plus corsée : appuyer sur les touches Ctrl+Z . Ceci émet un signal SIGTSTP qui arrête immédiatement le programme.

Dans le cas d'un script Python, SIGTSTP ne laisse pas le temps au script de se terminer normalement.

Il est à noter que certains scripts pourrraient ignorer ce signal.

kill

Dans d'autres situations plus complexes, par exemple si le script est lancé par un intermédiaire comme une boîte domotique, alors on n'a pas accès à Ctrl+C ou Ctrl+Z pour l'arrêter. À ce moment, il faut utiliser la commande kill.

D'abord, il faut trouver le numéro du processus qui correspond au script. Ceci sera fait à l'aide de la commande ps. On précisera qu'on ne veut voir que les processus dont le nom contient python.

Terminal

ps -ef | grep python

Vous obtiendrez un résultat semblable à cet extrait :

Résultat à l'écran

pi@raspberrypi:~ $ ps -ef | grep python
pi   891    1260    0    11:16    pts/0    00:00:00    python3    clignote.py
pi  1288    1260    0    07:57    pts/0    00:00:00    python3    allume_led.py

La deuxième colonne indique le numéro du processus. Ainsi, pour terminer le script clignote.py, il faut faire :

Terminal

kill -9 891

Il est possible d'utiliser le nom du signal à envoyer plutôt que son numéro :

Terminal

kill -SIGKILL 891

Ces deux commandes envoient un signal SIGKILL qui tue brutalement le processsus sans lui laisser la chance de se terminer de façon gracieuse (libération de la mémoire et tout et tout).

Aucun script ne peut ignorer ce signal.

Remarquez que le même résultat que Ctrl+C peut être obtenu en entrant ceci dans une seconde fenêtre Terminal :

  • kill -2 suivi du numéro de processus

    ou

  • kill -SIGINT suivi du numéro de processus

Pour plus d'information

« Signal (IPC) ». Wikipedia. https://en.wikipedia.org/wiki/Signal_(IPC)

« kill - Envoyer un signal à un processus ». MAN Linux Magique. http://www.man-linux-magique.net/man1/kill.html

« What to do when a Linux desktop freezes? - If all else fails, you Raise The Elephant ». Stack Exchange. https://unix.stackexchange.com/questions/31818/what-to-do-when-a-linux-desktop-freezes#answer-33891

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Par Christiane Lagacé
Dernière révision le 12 septembre 2021
Merci de partager !

Site fièrement hébergé chez A2 Hosting.

Soumettre