Ligne 32 : |
Ligne 32 : |
| | | |
| === Déclaration d'un service SystemD === | | === Déclaration d'un service SystemD === |
− | Nous avons un script Python qui ne fait que lire des données sur un WebService et [[LCD-USB-TTL-Raspberry|afficher les données sur un afficheur LCD USB]]. | + | Nous avons un script Python {{fname|lcdordertrack.py}} qui lit des données sur un WebService et [[LCD-USB-TTL-Raspberry|afficher les données sur un afficheur LCD USB]]. |
| | | |
− | Nous avons [http://arduino103.blogspot.be/2016/10/systemd-demarrage-automatique-dun.html décrit la marche à suivre dans cet article] (blog.mchobby.be)
| + | Voici, en quelques étapes, les opérations effectuées pour démarrer automatiquement le script {{fname|lcdordertrack.py}} au démarrage du Pi sous SystemD |
| | | |
− | {{traduction}}
| + | ==== Déclarer le service (une unité/unit) ==== |
| | | |
− | '''todo:''' dupliquer l'information sur cette page. | + | sudo nano /lib/systemd/system/lcdordertrack.service |
| + | |
| + | Et y ajouter le contenu suivant: |
| + | |
| + | <nowiki>[Unit] |
| + | Description=MCHobby LCD Order Tracker |
| + | After=multi-user.target |
| + | |
| + | [Service] |
| + | Type=idle |
| + | ExecStart=/usr/bin/python /home/pi/PrestaConsole/lcdordertrack.py > /home/pi/lcdordertrack.log 2>&1 |
| + | |
| + | [Install] |
| + | WantedBy=multi-user.target</nowiki> |
| + | |
| + | Utiliser la combinaison de touche CTRL-X, Y pour quitter nano en sauvant le fichier. |
| + | |
| + | Vous noterez que nous avons ajouté des redirections (sortie standard et sortie erreur) vers des fichiers de log. |
| + | |
| + | ==== Permission sur le service (l'unité) ==== |
| + | <font color="red">'''Un point vraiment important est de fixer correctement les permissions sur notre nouveau fichier!'''</font> |
| + | |
| + | sudo chmod 644 /lib/systemd/system/myscript.service |
| + | |
| + | Activer le service (unité) dans SystemD |
| + | |
| + | sudo systemctl daemon-reload |
| + | sudo systemctl enable myscript.service |
| + | |
| + | La deuxième ligne va créer un lien symbolique (propre au système) qui activera le service au prochain démarrage. |
| + | |
| + | Le plus facile maintenant est encore de faire un |
| + | |
| + | sudo reboot |
| + | |
| + | ==== Eviter les pièges - Utilisateur vs SystemD ==== |
| + | En utilisant un script python, vous devez garder à l'esprit qu'il n'utilise pas votre "login" courant pour fonctionner. |
| + | |
| + | Donc, ce qui est valable en session interactive ne le sera pas forcément lorsqu'il sera exécuté avec SystemD (le processus parent sera SystemD, donc avec un '''PID = 1''') |
| + | |
| + | Par exemple, si vous chargez un fichier de configuration ("ini"), {{underline|vous devrez spécifier le chemin complet}} vers le fichier (alors qu'il est simplement chargé depuis le répertoire courant si vous lancez votre script à la main dans un shell). |
| + | |
| + | ==== Etat du service et instructions utiles ==== |
| + | Il arrive souvent que cela ne fonctionne pas la première fois, c'est qu'utiliser un service à certaines contraintes (droit accès, sécurité sur les fichiers comme sur le GPIO par exemple, accès à certaines ressources). |
| + | |
| + | Nous avons prévu des fichiers de log dans dans la commande de démarrage ( /home/pi/lcdordertrack.log ), utile pour récupérer les informations produites par l'instruction print(). |
| + | |
| + | SystemD produit également de nombreuses informations utiles avec l'option {{fname|status}} . |
| + | |
| + | sudo systemctl status lcdordertrack.service |
| + | |
| + | ce qui avait produit ce résultat très intéressant: |
| + | |
| + | <nowiki>lcdordertrack.service - MCHobby LCD Order Tracker |
| + | Loaded: loaded (/lib/systemd/system/lcdordertrack.service; enabled) |
| + | Active: failed (Result: exit-code) since Sat 2016-10-29 10:38:13 UTC; 2min 45s ago |
| + | Process: 636 ExecStart=/usr/bin/python /home/pi/PrestaConsole/lcdordertrack.py > /home/pi/lcdordertrack.log 2>&1 (code=exited, status=1/FAILURE) |
| + | Main PID: 636 (code=exited, status=1/FAILURE) |
| + | |
| + | Oct 29 10:38:13 r1501 python[636]: Traceback (most recent call last): |
| + | Oct 29 10:38:13 r1501 python[636]: File "/home/pi/PrestaConsole/lcdordertrack.py", line 39, in |
| + | Oct 29 10:38:13 r1501 python[636]: config = Config() |
| + | Oct 29 10:38:13 r1501 python[636]: File "/home/pi/PrestaConsole/config.py", line 34, in __init__ |
| + | Oct 29 10:38:13 r1501 python[636]: self._presta_api_key = config.get( CONFIG_SECTION_PRESTAAPI, CONFIG...KEY ) |
| + | Oct 29 10:38:13 r1501 python[636]: File "/usr/lib/python2.7/ConfigParser.py", line 607, in get |
| + | Oct 29 10:38:13 r1501 python[636]: raise NoSectionError(section) |
| + | Oct 29 10:38:13 r1501 python[636]: ConfigParser.NoSectionError: No section: 'PRESTA-API' |
| + | Oct 29 10:38:13 r1501 systemd[1]: lcdordertrack.service: main process exited, code=exited, status=1/FAILURE |
| + | Oct 29 10:38:13 r1501 systemd[1]: Unit lcdordertrack.service entered failed state. |
| + | Hint: Some lines were ellipsized, use -l to show in full.</nowiki> |
| + | |
| + | Où nous pouvons voir qu'il y avait un problème dans le script {{fname|config.py}} (et donc la lecture de notre {{fname|config.ini}}) |
| + | |
| + | C'est la raison pour laquelle nous avons mentionné, plus tôt, qu'il fallait indiqué le chemin d'accès complet vers le fichier de configuration. |
| + | |
| + | ==== Démarrer, arrêter, ... ==== |
| + | sudo systemctl start lcdordertrack.service |
| + | |
| + | Voici la commande type qui permet de démarrer le service après modification ou ajustement. |
| + | |
| + | Vous avez également l'opportunité d'utiliser les commandes '''start''', '''stop''' et '''restart'''. Les commandes '''enable''' et '''disable''' permettent respectivement d'activer et désactiver un service. |
| + | |
| + | ==== Ressources utiles ==== |
| + | Je vous recommande chaudement les lectures suivantes (source d'information utiles pour systemD et le démarrage d'un script python depuis systemD). |
| + | * [https://medium.com/@johannes_gehrs/getting-started-with-systemd-on-debian-jessie-e024758ca63d#.gm57hiwi5 Getting Started With systemd on Debian Jessie] |
| + | * [http://www.raspberrypi-spy.co.uk/2015/10/how-to-autorun-a-python-script-on-boot-using-systemd/ How To Autorun A Python Script On Boot Using systemd] |
| + | * [https://learn.adafruit.com/running-programs-automatically-on-your-tiny-computer/systemd-writing-and-enabling-a-service Running Programs Automatically on Your Tiny Computer] (Adafruit.com)<br />Avec un excellent exemple pour créer un mini serveur/Service HTTP en Python :-) |
| + | * [http://www.framboise314.fr/systemd-tout-nouveau-tout-beau-ou-pas/#Comment_demarre_le_systeme systemd, tout nouveau tout beau ? ou pas...] (Framboise314)<br />Explique en autre comment démarrer vncserver avec systemd |
| | | |
| === Contourner SystemD (application graphique) === | | === Contourner SystemD (application graphique) === |