IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Script python en daemon avec bookworm


Sujet :

Raspberry Pi

  1. #1
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 231
    Par défaut Script python en daemon avec bookworm
    Bonjour tout le monde,

    J'ai un petit problème.

    Je travaille avec un raspberry4 de 8Gb. l'OS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pi@Schero:~ $ version
    Nom OS :   GNU/Linux
    Noyau  :   #1 SMP PREEMPT Debian 1:6.12.20-1+rpt1~bpo12+1 (2025-03-19)
    Relase :   6.12.20+rpt-rpi-v8
    Debian :   12.10   bookworm
    Nom PC :   Schero
    Machine :  aarch64
    pi@Schero:~ $
    Je tente de faire tourner un script python en tache de fond (daemon).
    Cela marchait pas mal sous Bulleye, mais je n'ai plus de réaction sous BookWorm

    J'ai essayé la méthode que j'utilisait sous Bulleyes, a savoir:
    un script python dans /home/pi/bash/arretraspi.py
    un Lien symbolique dans /usr/sbin/arretraspi -> /home/pi/bash/arretraspi.py
    une ligne dans /etc/rc.local sudo /usr/sbin/arretraspi

    Mais cela ne marche plus..

    Sur des tuto j'ai trouver comme créer des service dans /etc/sustemd/system/
    je l'ai fait,, le service demarre correctement(d'après systemctl status <monservice>.service
    Mais alors qu'il doit ecrire dans un fichier log lors de son démarrage, rien ne se passe.

    J'ai déja cherché, mais je ne trouve rien de probant pour Bookworm.

    Quelqu'un aurai-t-il une idée comment faire ??

    Pour info, mon script doit:
    Surveiller un GPIO (passage de l'état bas à l'état haut en cas de coupure de l'alimentation
    Fermer un programme (pkill )
    éteindre le Raspberry (cela se fait automatiquement via l'UPS x708 V2)

    Merci
    Michel

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 120
    Billets dans le blog
    47
    Par défaut
    Salut,

    Tu as regardé dans les logs du service avec journalctl -u <nom du service> ?

  3. #3
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 231
    Par défaut
    Bonjour f-leb,

    Alors, mon script s'appelle /home/pi/bash/plsd.py.
    le lien symbolique dans /usr/sbin/Arretraspi -> /home/pi/bash/plsd.py
    dans /etc/rc.local se trouve la ligne sudo /usr/sbin/Arretraspi &

    lorsque je fait journalctl -u plsd.py ou avec plsd, ou Arreteaspi, voir d'autre, j’obtiens:
    no entries........

    Pourtant au démarrage, le fichier log est remplis.......

    michel

  4. #4
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 231
    Par défaut Base du problème
    Après etude,

    Je crée un script python. Il lit l'état d'un GPIO. Si le GPIO est à 1, il écris une ligne dans un fichier log.

    Quand je teste ce script, il fonctionne très bien (avec Thonny).

    Donc je crée un lie symbolique vers ce fichier dans /usr/sbin.
    Je met une ligne dan /etc/rc.local qui démarre ce script.

    Le script démarre et crée la ligne dans le fichier log.
    Lorsque le GPIO passe à l'état 1, le script écris des caractère bizarre dans le fichier log:
    Depart plsd.py New
    ��������������
    Depart plsd.py New
    Et dès lors c'est le b...... pour la suite....

    Mais pourquoi ces caractères???
    voici le code python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #!/usr/bin/env python
    import RPi.GPIO as GPIO
    import time
    import datetime
    import os
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(5, GPIO.IN)
    
    
    def main():
        with open("/home/pi/log/alimlog.txt",'a') as f:
            f.write("\nDepart plsd.py New \n")
        
        while True:
            if(GPIO.input(5)==1):
                with open("/home/pi/log/alimlog.txt",'a') as f:
                    f.write("Close OpenCPN\n")
                print(GPIO.input(5))
                time.sleep(10)
        
        
    if __name__ == '__main__':
        main()
    Je ne comprend pas ou est ma gaffe...

    merci

  5. #5
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 231
    Par défaut Encore une info
    Pour faire suite,

    Comme le script est prévu pour arreter un programme, j'utilise la commande pkill pour arreter le programme, mais si le programme s'arrete bien,
    il ne sauvegarde pas sa configuration lors de l'arrêt......

    Si j'arrate ce programme via un terminal avec la même commande tous ce passe bien. Mais si c'est le script en daemon qui le fait, visiblement il a des problème pour ecrire sur le disque....

    Pour rappel avec bulleyes ce problème n'existai pas.....

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 120
    Billets dans le blog
    47
    Par défaut
    Citation Envoyé par michel.semal Voir le message
    Sur des tuto j'ai trouver comme créer des service dans /etc/sustemd/system/
    je l'ai fait,, le service demarre correctement(d'après systemctl status <monservice>.service
    Mais alors qu'il doit ecrire dans un fichier log lors de son démarrage, rien ne se passe.
    Si tu as un service qui démarre et qu'il y a un problème de permission, tu devrais repérer le problème dans le journal généré par systemd avec journalctl -u <monservice>.service, non ?

    Si tu ne vois rien, c'est que le service est mal configuré.

  7. #7
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 231
    Par défaut
    f-leb,

    Je ne pense pas à un problème de permission, lors du démarrage du systeme, le script est bien démarré.
    Pour preuve, le fichier log contient bien la ligne signalant le démarrage du script.

    Mais lors de la détection de la coupure de l'alimentation (GPIO6), le script ne fait pas l'écriture correcte dans le fichier:
    Depart bash/plsd.py
    20250417 14:28:03 Arret OpenCPN

    # Depart bash/plsd.py
    ����������������������������������
    # Depart bash/plsd.py
    Laligne avec les ? devais être:
    coupure de l'alimentation
    arret OpenCPN,
    arret raspi
    De même, le script contient des time.sleep() qui ne semble pas affecter le script.

    Bizarre, car avec bulleyes, cela marchait parfaitement


    Bon on chercher

    Aide ou idée bienvenue.....

    Michel

  8. #8
    Membre éclairé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 231
    Par défaut suite du problème
    Bonjour,

    Donc,
    J'ai un script python qui regarde si le GPIO6 est à 1
    Si GPIO6 est à 1 , le script ecris dans un fichier log.

    Lorsque je teste ce script en direct (via un terminal), tout va bien.
    Cependant si je le lance en arrière plan, il démarre mais ne réagit pas au GPIO6.
    De plus, si le script e arrière plan est arrêté, la relance du script donne des erreurs

    Voici les erreurs suite à la relance du script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    :~/bash $ ./plsd.py 
    Traceback (most recent call last):
      File "/home/pi/bash/./plsd.py", line 10, in <module>
        GPIO.setup(6, GPIO.IN)
      File "/usr/lib/python3/dist-packages/RPi/GPIO/__init__.py", line 696, in setup
        _check(lgpio.gpio_claim_input(_chip, gpio, {
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3/dist-packages/lgpio.py", line 755, in gpio_claim_input
        return _u2i(_lgpio._gpio_claim_input(handle&0xffff, lFlags, gpio))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3/dist-packages/lgpio.py", line 458, in _u2i
        raise error(error_text(v))
    lgpio.error: 'GPIO busy'
    enfin , voici le script python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #!/usr/bin/env python
    import RPi.GPIO as GPIO
    import time
    import datetime
    import os
    import sys
    
    
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(6, GPIO.IN)
    GPIO.setup(13, GPIO.OUT)
    GPIO.setwarnings(False)
    
    def LogIn(montxt):
        if "#" in montxt:
            temps = montxt
        else:
            temps = str(datetime.datetime.today())
            temps += montxt
            
        fichier = open("/home/pi/log/Openlog.txt", "a")
        fichier.write(temps)
        fichier.close()
    
    
    
    
    def my_callback(channel):
        if GPIO.input(6):     # if port 6 == 1
            print ("\n---AC Power Loss OR Power Adapter Failure---")
            print ("Close OpenCPN")
            os.system("pkill opencpn")
            LogIn(" Arret OpenCPN\n")
            time.sleep(5)
            print ("Close Raspi")
            LogIn(" Arret Raspi\n")        
            #GPIO.output(13, GPIO.HIGH)
            time.sleep(3)
            #GPIO.output(13, GPIO.LOW)
            print("GPIO LOW")
            sys.exit()
           #time.sleep(2)
    
        else:                  # if port 6 != 1
            print ("---AC Power OK,Power Adapter OK---")
            quit()
    
    
    LogIn("\n#")
    LogIn(" Depart daemon\n")
    GPIO.add_event_detect(6, GPIO.BOTH, callback=my_callback)
    input("Testing Started")


    Pourquoi ??

    Je ne comprend pas, c'est la gestion du GPIO qui pose problème ??

    Merci

    Michel

Discussions similaires

  1. Exécution d'un script python dans Blender avec un fichier .bat
    Par ero91 dans le forum Général Python
    Réponses: 4
    Dernier message: 24/01/2013, 12h53
  2. comparaison de deux fichiers textes avec un script python
    Par zekruss dans le forum Général Python
    Réponses: 1
    Dernier message: 10/11/2009, 05h52
  3. edition d'un fichier .txt avec un script python
    Par ziedzekri dans le forum Général Python
    Réponses: 7
    Dernier message: 06/10/2009, 00h14
  4. Executer un CppUnittest avec un script python
    Par merlinerick dans le forum Bibliothèques tierces
    Réponses: 6
    Dernier message: 20/08/2009, 14h13
  5. daemon avec Python
    Par nighthammer dans le forum Zope
    Réponses: 3
    Dernier message: 13/06/2006, 15h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo