Astuces système d’exploitation Démarrer une application au démarrage Présentation de systemd Pour démarrer automatiquement une application au démarrage de Linux, plusieurs solutions existent mais il y en a une qui est devenue répandue et qui est basée sur l’utilisation de la suite logicielle appelée systemd. Cette solution constitue une alternative moderne aux scripts d’initialisation “système V” (→ /etc/init.d/, /etc/rc?.d/, /etc/rc.local). L’exécution d’une application ou service au démarrage de Linux via systemd repose sur le contenu d’un fichier de configuration — avec l’extension .service — résidant dans le répertoire /etc/systemd/system. Ce fichier renseigne, entre autres choses : sur les commandes à exécuter pour lancer/arrêter l’application/service sur les autres applications/services sur lesquels reposent l’application/service que l’on désire gérer via systemd. Ceci permettra notamment de lancer notre application/service uniquement si les applications/services dont il dépend sont déjà en cours d’exécution sur l’environnement d’exécution de l’application/service (répertoire de travail, identité sour laquelle l’application/service doit être exécuté, variables d’environnement…) Il est également possible de lancer une application automatiquement lorsqu’un utilisateur se connecte. Le fichier de configuration sera alors placé dans ~/.config/systemd/user/ et non /etc/systemd/system. Cas d’utilisation : Lancer une application Qt/QML Le fichier ci-dessous illustre comment lancer une application Qt/QML nommée GuiApp développée dans le cadre d’un projet de 2ème année : /etc/systemd/system/myiaq-guiapp.service [Unit] Description=MyIAQ GuiApp - Application locale de visualisation des mesures de qualité d'air intérieur (1) Requires=mosquitto.service (2) After=mosquitto.service (3) [Service] Type=simple (4) Environment="DISPLAY=:0.0" (5) Environment="XDG_RUNTIME_DIR=/run/user/1000" (5) Environment="QT_QPA_PLATFORM=eglfs" (5) Environment="QT_QPA_PLATFORM_PLUGIN_PATH=/usr/local/qt5pi/plugins/platforms" (5) Environment="LD_LIBRARY_PATH=/opt/vc/lib" (5) Environment="QT_QPA_FONTDIR=/usr/share/fonts/truetype/dejavu/" (5) #Environment="QT_QPA_EGLFS_PHYSICAL_WIDTH=154" (5) #Environment="QT_QPA_EGLFS_PHYSICAL_HEIGHT=86" (5) WorkingDirectory=/home/pi/MyIAQ/GuiApp (6) User=pi (7) Group=pi (7) Restart=on-failure (8) RestartSec=10 (8) ExecStart=/home/pi/MyIAQ/GuiApp/GuiApp (9) [Install] WantedBy=multi-user.target (10) 1 Description de l’application/service 2 Dépendance de l’application/service 3 application/service devant être exécuté avant d’exécuter notre application/service 4 Type du service à lancer. standard correspond à un processus standard à exécuter en tâche de fond 5 variables d’environnement requises pour notre application/service (chemin librairies, dimensions physiques de l’écran, …) 6 Répertoire depuis lequel notre application/service sera exécuté 7 utilisateur/groupe sous lesquels l’application/service sera exécuté 8 spécifie de redémarrer l’application/service en cas d’erreur après 10s 9 chemin absolu de l’application/service à exécuter 10 Niveau d’exécution (→ Run level de SysV) dans lequel sera exécuté l’application/service Dès que ce fichier est sauvegardé, on peut : lancer manuellement l’application/service avec > sudo systemctl start myiaq-guiapp.service stopper manuellement l’application/service avec > sudo systemctl stop myiaq-guiapp.service lire le status d’exécution de l’application/service avec > sudo systemctl status myiaq-guiapp.service lancer automatiquement l’application/service lors des prochains démarrages avec > sudo systemctl enable myiaq-guiapp.service désactiver l’exécution automatique de l’application/service au démarrage avec > sudo systemctl disable myiaq-guiapp.service Lorsqu’on modifie le fichier .service, il faut actualiser la configuration de systemd avec la commande sudo systemctl daemon-reload avant de pouvoir rejouer une des commandes données ci-dessus. Références Understanding Systemd Units and Unit Files → Vue d’ensemble de systemd Créer un nouveau service avec systemd → tutoriel qui décrit la démarche à suivre pour transformer un programme en un service systemd pouvant être lancé automatiquement au démarrage du système. 🞄 🞄 🞄 Interfaces Librairie bcm2835