Question de newbie : interuptions

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Question de newbie : interuptions

Message par vague nerd » lun. 16 mai 2016 16:41

Bonjour.

J'intercepte le contrôle+C comme suit :

Code : Tout sélectionner

def end_read(signal,frame):
    global continue_reading
    print "Ctrl+C captured, ending read."
    continue_reading = False
    GPIO.cleanup()

signal.signal(signal.SIGINT, end_read)

while continue_reading:
    #do something really important
Cependant, quand je pers ma connexion ssh (timeout par exemple), la boucle conditionnée par "continue_reading" s'arrête (while continue_reading:), mais le GPIO.cleanup() n'est pas appelé.
Je ne comprend pas ce qui se passe (pas de trace du process avec une autre conneion ssh). J'imagine que end_read() n'est pas appelé, mais pourquoi la boucle s'arrête-elle ?
Des idées ? Est-ce plutôt une question linux ?
Est-il possible de programmer une autre interruption correspondant à "session closed" ?

Cdt.
Cordialement,

Vague Nerd

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Question de newbie : interuptions

Message par Manfraid » mar. 17 mai 2016 08:23

Salut,

si tu a lancer le script en ssh et que tu pert la connexion c'est normal que le reste du code n'est pas appeler, et je ne pense pas que l'on puisse capturer le signal

ce que je peu te conseillé c'est d'utilisé screen ou tmux (une préférence pour le 2ème) pour lancer tes scripts, comme ça en cas de perte de connexion ton script fonctionne toujours
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Question de newbie : interuptions

Message par vague nerd » mar. 17 mai 2016 10:17

si tu a lancer le script en ssh et que tu pert la connexion c'est normal que le reste du code n'est pas appeler
Je comprend bien que le code répondant à l'interception du crtl+c ne soit pas appelé. Par contre, je suis surpris que le script en cours d'exécution (boucle disons sans fin) soit tué...
Tout process (non demon) lancé par ssh est tué à la perte de la session ?
(Hé ben, mes souvenirs de linux sont bien vieux...)
Cdt.
Cordialement,

Vague Nerd

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Question de newbie : interuptions

Message par Manfraid » mar. 17 mai 2016 10:40

oui voila c'est exactement ça, c'est pour cela que je lance toujours un tmux sur mes machine que je prend en ssh comme ça même si perte de connexion les script/commande en cours reste active, c'est très pratique par exemple si tu fait une compilation sur le rasp sans avoir peur de perdre le ssh
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Question de newbie : interuptions

Message par vague nerd » mar. 17 mai 2016 12:14

Ok, merci.
J'imagine qu'a terme, je lancerai le script comme ça :

Code : Tout sélectionner

sudo python readWithLight.py &
en demon, quoi.
Mais du coup, faut que je trouve une meilleur condition pour arrêter ma boucle.
Là, c'est un boolean qui passe à faux sur interception du ctrl+c.
Cdt.
Cordialement,

Vague Nerd

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Question de newbie : interuptions

Message par Manfraid » mar. 17 mai 2016 12:53

même avec cette commande le script s’arrêtera a la perte du ssh
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Question de newbie : interuptions

Message par vague nerd » mar. 17 mai 2016 13:08

même avec cette commande le script s’arrêtera a la perte du ssh
Ha ben m***e, j'étais sûr de mon coup, là...
Cdt.
Cordialement,

Vague Nerd

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: Question de newbie : interuptions

Message par Manfraid » mar. 17 mai 2016 13:10

je me doute, en fait quand tu met le "&" en fin de ligne tu met jsute ton script en background mais dépendant du shell ouvert en ssh voila pourquoi celui-ci va se couper une fois le ssh fermer

pour ça je te conseille vraiment d'essayer tmux, car une foit détaché de la session toutes tes actions en cours le resterons
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Question de newbie : interuptions

Message par vague nerd » mar. 17 mai 2016 13:12

même avec cette commande le script s’arrêtera a la perte du ssh
Ha ben m***e, j'étais sûr de mon coup, là...
Ben je viens d'essayer : le script ne s'est pas arrêté...

EDIT :

Code : Tout sélectionner

ps aux | grep python
le script est toujour là (et fonctionne, c'est pas un zombi).
Cdt.
Cordialement,

Vague Nerd

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Question de newbie : interuptions

Message par vague nerd » mar. 17 mai 2016 13:41

Dans un premier pseudo terminal (pts/0) :

Code : Tout sélectionner

pi@automate ~/rfid-rc522/MFRC522-python $ who
pi       pts/0        2016-05-17 03:35 (ip.ip.ip.ip)
pi@automate ~/rfid-rc522/MFRC522-python $ ps aux | grep python
root      2284  0.4  2.7  24492 10504 ?        S    03:34   1:57 /usr/bin/python -O /usr/share/wicd/daemon/wicd-daemon.py
root      2325  0.2  2.8  15020 10892 ?        S    03:34   1:09 /usr/bin/python -O /usr/share/wicd/daemon/monitor.py
pi        8570  0.0  0.4   3584  1856 pts/0    S+   11:35   0:00 grep --color=auto python
Dans un second pseudo terminal (pts/1) :

Code : Tout sélectionner

pi@automate ~/rfid-rc522/MFRC522-python $ who
pi       pts/0        2016-05-17 03:35 (ip.ip.ip.ip)
pi       pts/1        2016-05-17 11:36 (ip.ip.ip.ip)
pi@automate ~/rfid-rc522/MFRC522-python $ who m i
pi       pts/1        2016-05-17 11:36 (ip.ip.ip.ip)
pi@automate ~/rfid-rc522/MFRC522-python $ sudo python readWithLight.py &
[1] 8627
pi@automate ~/rfid-rc522/MFRC522-python $ Press Ctrl-C to stop.
Fermeture du second terminal et retour sur le premier :

Code : Tout sélectionner

pi@automate ~/rfid-rc522/MFRC522-python $ who
pi       pts/0        2016-05-17 03:35 (ip.ip.ip.ip)
pi@automate ~/rfid-rc522/MFRC522-python $ ps aux | grep python
root      2284  0.4  2.7  24492 10504 ?        S    03:34   1:59 /usr/bin/python -O /usr/share/wicd/daemon/wicd-daemon.py
root      2325  0.2  2.8  15020 10892 ?        S    03:34   1:10 /usr/bin/python -O /usr/share/wicd/daemon/monitor.py
root      8627  0.0  0.7   4608  2668 ?        S    11:37   0:00 sudo python readWithLight.py
root      8628 47.9  1.5   8656  5932 ?        R    11:37   1:03 python readWithLight.py
pi        8658  0.0  0.4   3584  1748 pts/0    S+   11:39   0:00 grep --color=auto python
pi@automate ~/rfid-rc522/MFRC522-python $
Le process 8627 est bien rattaché à "?" et pas à pts/1.

EDIT : pas besoin de modifier la condition d'arrêt de ma boucle (un boolean mis à faux sur interception du ctrl+c).

Code : Tout sélectionner

sudo kill -SIGINT 8627
va bien (typiquement, ctrl+c envoie SIGINT !).
Cdt.
Cordialement,

Vague Nerd

Répondre

Retourner vers « Python »