#Utiliser systemd pour démarrer un service Linux au démarrage {{METATOC 4-5}} **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 ```