Systemd, créer un service pour lancer une application au démarrage

On utilise le système d’initialisation de Linux systemd.

Chaque service généré par systemd est configuré par un fichier .service qui se trouve dans le répertoire /etc/systemd/system.

Pour notre exemple, il faut donc créer un fichier /etc/systemd/system/yclock.service avec au minimum le contenu suivant:

[Unit]
Description=Affiche l'heure sur un YoctoDisplay

[Service]
Type=simple
ExecStart=/home/pi/autostart/yclock.py


[Install]
WantedBy=multi-user.target

Le paramètre Description permet de définir une description qui est affichée lors de certaines commandes de systemctl.

Le paramètre ExecStart de la section Service définit la commande à exécuter pour démarrer l’application, dans notre cas il s’agit de notre script /home/pi/autostart/yclock.py. Le paramètre Type permet de choisir le type de service, à moins que votre application ne fasse des forks, la valeur “simple” est suffisante.

Enfin le paramètre WantedBy définit à quel moment du boot le script doit être démarré. La valeur “multi-user.target” est la valeur qui devrait correspondre à 99% des cas, c’est-à-dire juste avant l’écran de login quand le réseau et les autres services critiques ont déjà été démarrés.

L’utilitaire systemctl permet de contrôler systemd. Les principales commandes sont :

  • enable: active le service, c’est-à-dire que le service sera démarré lors des prochains boots.
  • disable: désactive le service, c’est-à-dire que le service sera ignoré lors des prochains boots.
  • status: affiche l’état courant du service.
  • start: démarre immédiatement le service.
  • stop: stope immédiatement le service.

Donc, pour que notre script démarre automatiquement lors des prochains boots, il faut exécuter la commande suivante:

sudo systemctl enable yclock.service

Il est possible de stopper et redémarrer le service sans redémarrer l’OS. Ce qui permet par exemple de modifier le script Python sur un système en production. Mais ce n’est pas tout.

La commande journalctl permet d’afficher les logs d’exécution de notre programme. En plus, ces logs ne peuvent pas remplire complètement le disque car systemd stocke de la même manière tous les logs de l’OS. Donc, en fonction de la configuration de votre distribution, systemd gardera les X logs les plus récents du service, de manière à ne pas saturer le disque.

La commande pour afficher les logs de notre application yclock.py:

sudo journalctl -u yclock.service

D’autres paramètres du fichier permettent de configurer très finement comment et quand le service doit être démarré. Par exemple, le paramètre Restart permet de spécifier si le service doit être redémarré automatiquement lorsque l’exécutable se termine avec une erreur. Les paramètres User et Group permettent de choisir avec quel utilisateur et quel groupe le script sera exécuté.

Pour reprendre notre exemple, voici le fichier complet :

[Unit]
Description=Affiche l'heure sur un YoctoDisplay

[Service]
Type=simple
ExecStart=/home/pi/autostart/yclock.py
Restart=on-failure
RestartSec=30
User=pi
Group=pi

[Install]
WantedBy=multi-user.target

Ce fichier précise en plus que le script doit être exécuté par l’utilisateur “pi” et le groupe “pi”. De plus, si le script se termine avec un code d’erreur, par exemple si aucun YoctoDisplay n’est connecté, il faut essayer de le relancer après 30 secondes.

Si vous avez besoin de configuration plus pointue, vous pouvez toujours consulter la documentation du projet à cette adresse:https://freedesktop.org/wiki/Software/systemd