Forum Linux.embarqué Quelques problèmes avec systemd...

Posté par . Licence CC by-sa.
Tags : aucun
0
12
avr.
2019

Bonsoir à tous, je suis débutant dans le monde de Linux, et j'ai quelques petits soucis avec systemd et ma RaspberryPi 3 (Raspbian). Je vous explique :

Je voudrais lancer un programme (lin_guider) au démarrage de ma Raspberry avec un service dans systemd mais le service (que j'ai appelé DEMARRAGE) plante quand il est lancé. En effet, j'obtiens ce message d'erreur sur l'écran de la Pi :
job DEMARRAGE.service/start deleted to break ordering cycle starting with multi-user.target/start
Je cherche depuis quelques jours jours une solution à ce problème, en vain.

J'ai quand même quelques pistes :
- Je suis à peu près sûr que c'est le type qui n'est pas le bon, mais je n'arrive pas à trouver le bon. Pour les targets, cela me semble logique comme cela, mais je me trompe certainement.
- j'ai trouvé comment afficher le journal de systemd, que je vous mets en pièce jointe. Personnellement, je ne sais pas trop comment l'exploiter. Vous trouverez également le service en lui-même, ainsi que ses permissions.

Merci d'avance pour vos conseils,

Arnaud.

https://www.dropbox.com/sh/d9vofbrvzv93o8o/AAA4f6-uH7OpJAF2CrVcU98Ya?dl=0

  • # Cycle

    Posté par (page perso) . Évalué à 6.

    Ce n'est pas un problème de type, c'est un problème de dépendances.

    graphical.target dépend de multi-user.target.

    Le WantedBy=multi-user.target ajoute une dépendance de multi-user.target vers DEMARRAGE.service. Le After=graphical.target ajoute une dépendance de DEMARRAGE.service vers graphical.target.

    Le tout est connu sous le nom de « serpent qui se mord la queue » (aïe).

    La prochaine fois, n'hésite pas à inclure directement le DEMARRAGE.service dans l'entrée de forums. ;)

    Ça facilite les copier-coller et évite d'aller farfouiller des images sur Dropbox.

    Debian Consultant @ DEBAMAX

    • [^] # Re: Cycle

      Posté par . Évalué à 1.

      Ah ok ! Donc il me suffit de mettre After=multi-user.target en plus !
      J'ai modifié mon service comme ceci

      [Unit]
      Description=lancer le script dem.sh qui lance lin_guider au demarrage
      After=multi-user.target
      After=graphical.target
      
      [Service]
      Type=idle
      ExecStart=/bin/sh /home/pi/dem.sh > /home/pi/dem.log 2>&1
      
      [Install]
      WantedBy=multi-user.target
      

      Je n'ai plus de message d'erreur au début : Merci :)

      Par contre, lors de la commande systemctl status DEMARRAGE.service, systemd me dit que mon service est chargé, mais a été "tué" parcequ'il ne trouve pas le fichier mon fichier shell dans home/pi.

      ● DEMARRAGE.service - lancer le script dem.sh qui lance lin_guider au demarrage
         Loaded: loaded (/lib/systemd/system/DEMARRAGE.service; enabled; vendor preset: enabled)
         Active: inactive (dead) since Fri 2019-04-12 02:58:29 CEST; 13min ago
        Process: 591 ExecStart=/bin/sh /home/pi/dem.sh > /home/pi/dem.log 2>&1 (code=exited, status=0/SUCCESS)
       Main PID: 591 (code=exited, status=0/SUCCESS)
      
      avr 12 02:58:28 raspberrypi systemd[1]: Started lancer le script dem.sh qui lance lin_guider au demarrage.
      avr 12 02:58:29 raspberrypi sh[591]: /home/pi/dem.sh: 8: /home/pi/dem.sh: [[: not found
      

      Je viens de revérifier un énième fois qu'il y est bien, et je ne vois pas pourquoi il ne le trouve pas. Tout me semble pouratnt correct mais ne l'est manifestement pas… J'avoue que là, je suis complètemen perdu.

      • [^] # Re: Cycle

        Posté par (page perso) . Évalué à 1.

        Bonjour,

        Ce n'est pas le fichier /home/pi/dem.sh qu'il ne trouve pas mais le fichier "[[:".

        C'est une erreur de syntaxe dans le script. Sans voir le fichier dem.sh, difficile de donner plus d'informations.

        • [^] # Re: Cycle

          Posté par (page perso) . Évalué à 3.

          Probablement juste [[, j'imagine que : après est un séparateur dans le message d'erreur.

          Les espaces à l'intérieur des crochets sont obligatoires en shell.

          Debian Consultant @ DEBAMAX

        • [^] # Re: Cycle

          Posté par . Évalué à 2.

          Merci à vous deux de m'aider :)

          Voici le fichier en question :

          #!/bin/bash
          
          #repfichierpython=/home/pi
          
          #cd "${repfichierpython}"
          
          #initialisations diverses
          if [[ $1 == "set-time" ]]; then #Donc si je comprends bien, c'est là que ça bloque. 
            sudo gnome-control-center datetime
          fi
          
          # Utiliser sudo si necessaire
          #sudo python3 demarrage.py >>demarrage.log 2>>demarrage.err
          /home/pi/lin_guider/lin_guider_pack/lin_guider/lin_guider &
          #cd - le & permet de lancer le processus et de contineur à faire quelque ch$
          

          Tout ce qui est en commentaire est ce qui reste d'une ancienne tenative que je n'ai pas envie d'effacer pour ne pas faire deux fois les mêmes erreurs ;)

          • [^] # Re: Cycle

            Posté par . Évalué à 5. Dernière modification le 14/04/19 à 00:58.

            C'est parce que tu force l'exécution (dans le ExecStart de ton unité) avec /bin/sh, alors que ton script est écrit pour bash ([[ est un syntaxe spécifique à bash).

            Et de toute façon, essayer de faire des redirections dans l'ExecStart de l'unité systemd ne fonctionnera pas, il faut le faire dans le script lui-même.
            Je te recommande de lire les pages de manuel systemd.unit et systemd.service

            • [^] # Re: Cycle

              Posté par . Évalué à 3.

              je penses meme que la ligne

              ExecStart=/bin/sh /home/pi/dem.sh > /home/pi/dem.log 2>&1

              peut devenir

              ExecStart=/home/pi/dem.sh > /home/pi/dem.log 2>&1

              vu que le shebang est placé en debut de dem.sh
              suffit alors juste de lui donner les droits en execution

              • [^] # Re: Cycle

                Posté par . Évalué à 4.

                Non, justement, systemd ne fait pas de redirection, donc en écrivant ça le script va obtenir en argument les valeurs: ">" "/home/pi/dem.log" "2>&1"
                Si tu veux faire des redirections, c'est dans le script lui-même qu'il faut le faire (ou encapsuler dans un script qui ne sert qu'à ça).

                Mais dans l'exemple donné, ça ne sert à rien, systemd redirige automatiquement les deux sortie du programme vers le journal, qu'oçn peut ensuite consulter avec journalctl, et les dernière lignes sont directement fournies quand on fait un systemctl status.

                Donc, il suffit d'exécuter le script, sans rien d'autre.

  • # Réponse

    Posté par . Évalué à 1.

    Salut !
    Donc, à vous lire je ne pourrais écrire que ceci :

    [Unit]
    Description=lancer le script dem.sh qui lance lin_guider au demarrage
    After=multi-user.target
    After=graphical.target
    
    [Service]
    Type=simple
    ExecStart=/home/pi/dem.sh
    
    [Install]
    WantedBy=multi-user.target
    
    

    car les logs seront fournis dans le journactl et par la commande status et que le shabang du fichier bash défini "qui" exécute le fichier.

    J'ai relu encore un peu plus de doc, dont celle proposée par wismerhill et suite à ça, j'ai modifié deux choses :
    - les permissions du service avec chmod 644 (rwx-r..-r..). Le fichier dem.sh a les droits en exécution pour tout les utilisateurs.
    - sa place. J'ai lu que pour des projets perso, il valait mieux les faire dans /etc/systemd/system que dans /lib/systemd/system.

  • # ça fonctionne... à moitié

    Posté par . Évalué à 1. Dernière modification le 16/04/19 à 15:40.

    Bonjour !

    Je persévère, mais j'ai toujours des erreurs qui s'affichent lors de l'exécution de mon service DEMARRAGE qui ressemble désormais à ceci

    [Unit]
    Description=lancer le script dem.sh qui lance lin_guider au demarrage
    After=multi-user.target
    After=graphical.target
    
    [Service]
    Type=forking
    RemainAfterExit=no
    ExecStart=/home/pi/dem.sh
    
    [Install]
    WantedBy=multi-user.target
    

    Lors de la commande systemctl status DEMARRAGE.service, j'obtiens ce résultat

    ● DEMARRAGE.service - lancer le script dem.sh qui lance LIN-GUIDER au demarrage
       Loaded: loaded (/etc/systemd/system/DEMARRAGE.service; enabled; vendor preset: enabled)
       Active: failed (Result: exit-code) since Fri 2019-04-12 17:53:28 CEST; 28s ago
      Process: 1251 ExecStart=/home/pi/dem.sh (code=exited, status=0/SUCCESS)
     Main PID: 1252 (code=exited, status=1/FAILURE)
    
    avr 12 17:53:28 raspberrypi systemd[1]: Starting lancer le script dem.sh qui lance LIN-GUIDER au demarrage...
    avr 12 17:53:28 raspberrypi systemd[1]: Started lancer le script dem.sh qui lance LIN-GUIDER au demarrage.
    avr 12 17:53:28 raspberrypi dem.sh[1251]: lin_guider: cannot connect to X server
    avr 12 17:53:28 raspberrypi systemd[1]: DEMARRAGE.service: Main process exited, code=exited, status=1/FAILURE
    avr 12 17:53:28 raspberrypi systemd[1]: DEMARRAGE.service: Unit entered failed state.
    avr 12 17:53:28 raspberrypi systemd[1]: DEMARRAGE.service: Failed with result 'exit-code'.
    

    Je sens que j'avance, au moins je sais que le script dem.sh se lance, maintenant !
    Par contre, lorsque j'exécute le script "manuellement", tout va bien, lin_guider se lance correctement.

    Il me semble donc que c'est ce fameux "X server" qui coince… Quelqu'un a-t-il une idée de comment résoudre ce problème, ou une piste à explorer ? Je n'ai rien trouvé de bien convaincant de mon côté.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.