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

🞄  🞄  🞄