Créer un service utilisateur simple avec SystemD

Menu principal

Ce billet décrit comment créer un service utilisateur simple avec SystemD afin qu’il soit automatiquement lancé au démarrage du système d’exploitation.

SystemD permet de gérer le lancement de services à un niveau système ou à un niveau utilisateur.

Recourir à des services utilisateurs est préférable pour le système. Cela nécessite moins de droits, permet de regrouper la configuration d’une application dans le répertoire de son utilisateur etc.

Cas d’utilisation

Bien qu’il puisse servir dans d’autres cas, le service décrit ici a été conçu avec les points suivants en tête :

Le service utilisateur

Le service utilisateur que nous allons mettre en place sert à lancer un exécutable au démarrage du système.

Les fichiers de service de SystemD portent tous l’extension .service. Dans le cas de notre application, le fichier s’appelle pad.service.

Il doit être enregistré dans l’arborescence suivante :

~
systemd
[Unit]
Description=Zigazou's pad

[Service]
Type=simple
ExecStart=/home/pad/application/pad
WorkingDirectory=/home/pad/application
Environment=YESOD_APPROOT=pad.zigazou.dev
Restart=on-failure

[Install]
WantedBy=sockets.target 

Quelques explications :

ExecStart=/home/pad/application/pad
L’exécutable pad se trouve dans le répertoire application de l’utilisateur pad. Il s’agit d’un utilisateur classique mais dédié à l’application.
WorkingDirectory=/home/pad/application
Plutôt que de créer un script intermédiaire pour définir l’environnement de notre exécutable, il est plus simple de le définir grâce à SystemD.
Environment=YESOD_APPROOT=pad.zigazou.dev
SystemD permet également de définir des variables d’environnement. Ici, la variable YESOD_APPROOT est positionnée à la valeur pad.zigazou.dev car notre application a été développée avec le framework Yesod en Haskell et qu’elle se trouve derrière un reverse-proxy.
Restart=on-failure
SystemD redémarrera automatiquement le service s’il venait à planter mais pas si on l’arrête proprement.
WantedBy=sockets.target
Indique à SystemD de démarrer le service avec la cible sockets (utilisée lors du démarrage du système d’exploitation)

Installation du service utilisateur

Les commandes ci-dessous sont nécessaires pour installer et démarrer notre service :

shell
sudo loginctl enable-linger pad
systemctl daemon-reload --user
systemctl start pad --user
systemctl enable pad --user
sudo loginctl enable-linger pad
C’est la seule commande à exécuter avec les droits de l’utilisateur root. Elle permet d’activer SystemD pour l’utilisateur pad.
systemctl daemon-reload --user
Demande à SystemD d’analyser le répertoire ~/.config/systemd/user afin qu’il puisse découvrir notre service.
systemctl start pad --user
Démarre le service
systemctl enable pad --user
Démarre le service au démarrage du système
L’option importante dans ces commandes est --user car elle indique à SystemD de travailler au niveau utilisateur. Sans elle, SystemD cherche à travailler au niveau système par défaut, ce qu’il ne peut faire sans droit d’administration.