Utiliser systemd pour démarrer un service Linux au démarrage
Table of Contents
systemd est un outil système Linux initialement développé par l'équipe Red Hat Linux. Il comprend de nombreuses fonctionnalités, notamment un système d'amorçage utilisé pour démarrer et gérer les processus système. Il s'agit actuellement du système d'initialisation par défaut sur la plupart des distributions Linux. De nombreux outils logiciels couramment utilisés, tels que SSH et Apache, sont livrés avec un service systemd.
Il est simple de créer un service systemd personnalisé qui exécutera n’importe quel script ou processus de votre choix. Bien qu'il existe plusieurs façons d'exécuter un script ou de démarrer un processus au démarrage de votre Linode, un service systemd personnalisé facilite le démarrage, l'arrêt ou le redémarrage de votre script, ainsi que sa configuration pour qu'il démarre automatiquement au démarrage. systemd offre l'avantage d'utiliser une interface standardisée et cohérente dans toutes les distributions Linux qui la prennent en charge.
Créer un service systemd personnalisé
Créer un script ou un exécutable que le service gérera, par exemple un simple script Bash test_service.sh
:
DATE=`date '+%Y-%m-%d %H:%M:%S'`
echo "Example service started at ${DATE}" | systemd-cat -p info
while :
do
echo "Looping...";
sleep 30;
done
Ce script enregistrera l'heure à laquelle il est initialisé, puis bouclera à l'infini pour maintenir le service en marche.
Copier le script dans /usr/bin
et le rendre exécutable :
sudo cp test_service.sh /usr/bin/test_service.sh sudo chmod +x /usr/bin/test_service.sh
Créer un fichier Unit /lib/systemd/system/myservice.service
pour définir un service systemd :
[Unit] Description=Exemple de service systemd. [Service] Type=simple ExecStart=/bin/bash /usr/bin/test_service.sh [Install] WantedBy=multi-user.target
Cela définit un service simple. La partie critique est la directive ExecStart
, qui spécifie la commande qui sera exécutée pour démarrer le service.
Copier le fichier d'unité dans /etc/systemd/system
et lui accorder les autorisations :
sudo cp monservice.service /etc/systemd/system/myservice.service sudo chmod 644 /etc/systemd/system/myservice.service
Démarrer et activer le service
Une fois que l'on dispose d’un fichier unité, on peut tester le service :
sudo systemctl start myservice
Vérifier l'état du service :
sudo systemctl status myservice
Si le service fonctionne correctement, le résultat doit ressembler à ce qui suit :
● myservice.service - Example systemd service. Loaded: loaded (/lib/systemd/system/myservice.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2018-05-01 18:17:14 UTC; 4s ago Main PID: 16266 (bash) Tasks: 2 Memory: 748.0K CPU: 4ms CGroup: /system.slice/myservice.service ├─16266 /bin/bash /usr/bin/test_service.sh └─16270 sleep 30 May 01 18:17:14 localhost systemd[1]: Started Example systemd service.. May 01 18:17:14 localhost cat[16269]: Example service started at 2018-05-01 18:17:14 May 01 18:17:14 localhost bash[16266]: Looping...
Le service peut être arrêté ou redémarré à l'aide des commandes systemd standard :
sudo systemctl stop myservice sudo systemctl restart myservice
Enfin, utilisez la commande **enable** pour que le service démarre à chaque démarrage du système :
sudo systemctl enable myservice
Un lien symbolique sera créé à partir de /etc/systemd/system/multi-user.target.wants/myservice.service
vers /lib/systemd/system/myservice.service
.
Redémarrer et vérifier l'état du service :
sudo systemctl statut mon service
On doit voir que le service a enregistré son heure de démarrage immédiatement après le démarrage :
● myservice.service - Example systemd service. Loaded: loaded (/usr/lib/systemd/system/myservice.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2018-05-02 15:03:07 UTC; 48s ago Main PID: 2973 (bash) CGroup: /system.slice/myservice.service ├─2973 /bin/bash /usr/bin/test_service.sh └─3371 sleep 30 May 02 15:03:07 localhost systemd[1]: Started Example systemd service.. May 02 15:03:07 localhost systemd[1]: Starting Example systemd service.... May 02 15:03:07 localhost bash[2973]: Looping... May 02 15:03:37 localhost bash[2973]: Looping...
Dépannage
La ligne « Exemple de service démarré à … » n'apparaît pas dans la sortie de la commande status. La sortie systemd-cat n'est pas fiable en raison d'une condition de concurrence critique. Pour contourner ce problème, mettre à jour le fichier test_service.sh
comme suit :
info=/tmp/myservice-systemd-cat-pipe-info mkfifo "$info" trap "exec 3>&-; rm $info" EXIT systemd-cat -p info < "$info" & exec 3>"$info" DATE=`date '+%Y-%m-%d %H:%M:%S'` echo "Example service started at ${DATE}" > "$info" while : do echo "Looping..."; sleep 30; done