Ticker

6/recent/ticker-posts

Ad Code

Responsive Advertisement

Comment créer un service Linux (systemd)

Sur Linux, lorsque l’on installe certaines applications qui ne fonctionne pas par défaut en service (daemon).
On peut souhaiter l’installer en tant que service pour la rendre actif au démarrage du système ou à la connexion utilisateur.

Dans ce tutoriel, je vous montre comment ajouter un service au gestionnaire de services systemd disponible sur Debian, Ubuntu, Mint, Fedora et d’autres distributions Linux.
A partir de là, vous pouvez faire en sorte que le service s’exécute au démarrage de Linux et le contrôler à travers son utilitaire systemctl.

Comment créer un service Linux (systemd)

Créer le fichier d’unité d’un service systemd

Tout d’abord, vous devez créer un fichier *.service. Par exemple, rtorrent.service, minecraft.service, etc.
Dans Linux, il existe deux emplacement où créer le fichier de service systemd :

  • /etc/systemd/system/ – pour que le service s’exécute au démarrage du système
  • /etc/systemd/user/ – service qui s’exécute à la connexion de n’importe quel utilisateur
  • ~/.config/systemd/user/ – pour que le service s’exécute à la connexion d’un utilisateur spécifique

Le fichier de service systemd comporte trois sections importantes et nécessaires. Il s’agit des sections [Unit], [Service] et [Install]. L’extension du fichier de service systemd est .service et nous utilisons le symbole dièse/cash (#) pour les commentaires d’une seule ligne.

Vous trouverez ci-dessous un exemple de fichier de service systemd. Veuillez noter qu’il ne s’agit PAS d’un véritable fichier de service systemd. Je l’ai modifié pour vous aider à comprendre.

Voici un exemple de service pour rtorrent que je place dans /etc/systemd/system/rtorrent.service :

[Unit]
Description=rTorrent system daemon
After=network.target

[Service]
Type=simple
User=debian
Group=debian

Environment=SESSION_DIR=/opt/torrent/session/

ExecStartPre=/bin/rm -f ${SESSION_DIR}/rtorrent.lock
ExecStart=/usr/bin/rtorrent -n -o import=/home/debian/.rtorrent.rc

Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target

Description d’un fichier d’unité de service

La section Unit

La section Unit contient les détails et la description générales du service.
Voici quelques entrées disponibles dans cette section :

  • Description : Titre lisible par l’homme du service systemd
  • After : Définit la dépendance d’un service. Par exemple, si vous configurez le serveur Web Nginx, vous voulez que le serveur démarre après que le réseau soit en ligne. Cela inclut généralement les cibles ou d’autres services
  • Before : Démarrer le service actuel avant le service spécifié. Dans cet exemple, je dis que “je veux que le serveur web Apache démarre avant que le service pour Nextcloud ne soit lancé”. C’est parce que, dans mon cas, le serveur Nextcloud dépend du serveur web Nginx

La section Service

La section Service permet de configurer l’exécution du service.
Il existe des dizaines et dizaines d’options différentes.
Voici les principales options :

  • ExecStartPre : S’exécute avant ExecStart. Cela permet de préparer le service
  • ExecStart : La commande qui s’exécute lorsque le service démarre
  • ExecReload : C’est un champ facultatif. Il spécifie comment un service est redémarré. Pour les services qui effectuent des E/S sur le disque (en particulier l’écriture sur le disque, comme une base de données), il est préférable de les tuer de manière élégante et de les redémarrer. Utilisez ce champ dans le cas où vous souhaitez avoir un mécanisme de redémarrage spécifique
  • ExecStartPost : S’exécute après ExecStart

Voici un exemple des entrées Exec du service MySQL.
Vous pouvez spécifier plusieurs fois les entrées Exec.

ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld
ExecStartPre=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION"
ExecStartPre=/bin/sh -c "[ ! -e /usr/bin/galera_recovery ] && VAR= || \
ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION
ExecStartPost=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION"
ExecStartPost=/etc/mysql/debian-start
  • User et Group sont des champs facultatives afin d’exécuter le service sous un utilisateur et groupe spécifiques.
User=debian
Group=debian
  • Environnement : Permet de créer une variable d’environnement
Environment=SESSION_DIR=/opt/torrent/session/
  • Type : Ceci indique le type de démarrage d’un processus pour un service systemd donné. Les options sont simple, exec, forking, oneshot, dbus, notify et idle. (plus d’informations ici)

Voici les types possibles :

  • Type=simple (par défaut) : systemd considère que le service doit être démarré immédiatement. Le processus ne doit pas forker. N’utilisez pas ce type si d’autres services doivent être commandés sur ce service, à moins qu’il ne soit activé par socket
  • Type=forking : systemd considère que le service est démarré une fois que le processus a forké et que le parent est sorti. Pour les démons classiques, utilisez ce type sauf si vous savez que ce n’est pas nécessaire. Vous devez également spécifier PIDFile= pour que systemd puisse garder la trace du processus principal
  • Type=oneshot : ceci est utile pour les scripts qui effectuent une seule tâche et se terminent ensuite. Vous pouvez également définir RemainAfterExit=yes pour que systemd considère toujours le service comme actif après la sortie du processus. Définir RemainAfterExit=yes est approprié pour les unités qui changent l’état du système (par exemple, monter une partition)
  • Type=notify : identique à Type=simple, mais avec la stipulation que le démon enverra un signal à systemd lorsqu’il sera prêt. L’implémentation de référence pour cette notification est fournie par libsystemd-daemon.so.
  • Type=dbus : le service est considéré comme prêt lorsque le BusName spécifié apparaît sur le bus système de DBus
  • Type=idle : systemd retardera l’exécution du binaire du service jusqu’à ce que tous les travaux soient distribués. A part cela, le comportement est très similaire à Type=simple
  • Restart : C’est un autre champ optionnel mais que vous utiliserez très probablement. Il spécifie si un service doit être redémarré – en fonction des circonstances – ou non. Les options disponibles sont non no, on-success, on-failure, on-abnormal, on-watchdog, on-abort et always
  • RestartSec : Définit le délai avant de redémarrer le service

Il existe de nombreux autres options, vous les trouverez dans le man : man systemd.service.

La section Install

La section Install, comme son nom l’indique, gère l’installation d’un service/unité systemd. Il est utilisé lorsque vous exécutez les commandes systemctl enable et systemctl disable pour activer ou désactiver un service.

Voici les champs de la section Installer :

  • WantedBy : Ce champ est similaire aux champs After et Before, mais la principale différence est qu’il est utilisé pour spécifier les “niveaux d’exécution” équivalents à ceux de systemd. La cible par défaut est le moment où l’initialisation du système est terminée, c’est-à-dire le moment où l’utilisateur est invité à se connecter. La plupart des services destinés aux utilisateurs (comme Apache, cron, GNOME-stuff, etc.) utilisent cette cible
  • RequiredBy– Ce champ peut sembler très similaire à WantedBy, mais la principale différence est que ce champ spécifie des dépendances dures. Autrement dit, si une dépendance n’existe pas, ce service échouera

Démarrer le nouveau service et vérifier son fonctionnement

Pour démarrer un service, utilisez la commande systemctl avec l’option start et le nom du service :

systemctl start rtorrent

Si vous avez créer un service de type user, ajoutez l’option –user comme ceci :

systemctl --user start rtorrent.service

Ensuite on utilise l’option status pour vérifier le fonctionnement :

systemctl status rtorrent.service

Enfin si vous rencontrez des erreurs de démarrage du service, vérifiez les journaux à l’aide de la commande journalctl :

journalctl -e -u rtorrent

Comment rendre le service actif au démarrage de Linux

systemctl enable rtorrent.service

Cela va créer le lien symbolique :

Created symlink /etc/systemd/system/multi-user.target.wants/rtorrent.service → /etc/systemd/system/rtorrent.service.

A partir de là, le service est actif au démarrage du système (ou à la connexion de l’utilisateur pour un service utilisateur).
Pour le rendre inactif du démarrage du système, utilisez l’option disable :

systemctl disable rtorrent.service

L’article Comment créer un service Linux (systemd) est apparu en premier sur malekal.com.

Enregistrer un commentaire

0 Commentaires