Vous souhaitez automatiser le lancement d’un programme Linux au démarrage ? Systemd, le gestionnaire de services omniprésent sur la majorité des distributions Linux, y compris Ubuntu, offre une solution élégante. Ce guide vous accompagnera dans la création d’un service personnalisé, capable de s’intégrer harmonieusement avec le système et de communiquer avec le journal système.
Ce tutoriel est spécifiquement dédié à la configuration d’un service qui démarre au lancement du système. Si vous cherchez à lancer une application graphique lors de votre connexion, tournez-vous plutôt vers le gestionnaire de démarrage de votre environnement de bureau.
Automatisation du lancement de programmes
Certains logiciels que vous installez s’intègrent directement au processus de démarrage de Linux, assurant leur lancement automatique à chaque allumage de l’ordinateur. Cette fonctionnalité peut être aisément reproduite pour vos propres scripts, applications ou tout autre programme présent sur votre machine.
La gestion des programmes lancés au démarrage est assurée par systemd, le gestionnaire de systèmes et services. En tant que premier processus exécuté au démarrage, systemd possède toujours l’ID de processus (PID) 1. Tous les autres processus en cours d’exécution sur votre machine sont lancés soit directement par systemd, soit par un processus lui-même démarré par systemd.
Les programmes fonctionnant en arrière-plan sont communément appelés démons ou services. Le « d » à la fin de systemd renvoie à cette notion de démon. Dans ce tutoriel, nous allons illustrer la création d’un service. Pour qu’il soit complet, notre service devra :
Être intégré à systemd via un fichier d’unité de service
Être lancé lors du démarrage du système
Être contrôlable à l’aide de systemctl, l’interface de gestion de systemd
Être capable de journaliser ses activités
Création du programme à exécuter
Il nous faut un programme que systemd pourra lancer. Nous allons créer un script simple, que nous appellerons « htg.sh ». Ce tutoriel utilise l’éditeur de texte Gedit, mais vous pouvez utiliser l’éditeur de votre choix.
touch htg.sh
gedit htg.sh
L’éditeur gedit s’ouvre. Copiez et collez le code suivant dans l’éditeur.
#!/bin/bash echo "htg.service: ## Démarrage ##" | systemd-cat -p info while : do TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') echo "htg.service: horodatage ${TIMESTAMP}" | systemd-cat -p info sleep 60 done
Enregistrez vos modifications, puis fermez l’éditeur.
Ce script est basique, mais quelques points méritent une explication.
Les deux lignes de commande echo sont redirigées vers systemd-cat, un utilitaire qui capture la sortie d’un programme pour l’envoyer au journal système. Les entrées de journal sont assorties de priorités. Nous utilisons l’option -p (priorité) pour indiquer que nos messages sont de niveau informatif (info) uniquement, sans erreur ou avertissement critique.
Le script contient une boucle while infinie.
La variable TIMESTAMP est définie avec la date et l’heure courantes. Cette information est formatée dans un message puis envoyée au journal.
Le script entre en pause pendant 60 secondes.
Après 60 secondes, la boucle est répétée. Ce script écrit donc un message horodaté dans le journal toutes les minutes.
Nous allons copier le script dans le répertoire /usr/local/bin.
sudo cp htg.sh /usr/local/bin
Nous devons également le rendre exécutable :
sudo chmod +x /usr/local/bin/htg.sh
Création du fichier d’unité de service
Chaque programme lancé par systemd possède un fichier de définition, appelé fichier d’unité de service. Ce fichier contient les attributs nécessaires à systemd pour localiser et lancer le programme, ainsi que pour définir son comportement.
Nous devons créer un fichier d’unité pour notre nouveau service. Par précaution, nous allons nous assurer qu’aucun fichier d’unité existant ne porte le nom que nous souhaitons utiliser.
sudo systemctl list-unit-files --type-service
Parcourez la liste des fichiers d’unité, triée par ordre alphabétique, pour vérifier que le nom que vous souhaitez utiliser est libre.
Notre service s’appellera « htg.service ». Aucun fichier d’unité ne porte ce nom, nous pouvons donc procéder à la création de notre fichier d’unité.
sudo gedit /etc/systemd/system/htg.service
L’éditeur gedit s’ouvre. Copiez et collez le texte suivant dans l’éditeur :
[Unit] Description=Exemple de service toptips.fr Wants=network.target After=syslog.target network-online.target [Service] Type=simple ExecStart=/usr/local/bin/htg.sh Restart=on-failure RestartSec=10 KillMode=process [Install] WantedBy=multi-user.target
Enregistrez vos modifications et fermez l’éditeur.
Voici la signification des entrées, typiques pour un service. Bien que notre service simple n’en ait pas besoin pour la plupart, leur inclusion permet de les expliquer :
Description : description textuelle de votre service.
Wants : notre service souhaite, sans pour autant l’exiger, que le réseau soit opérationnel avant son démarrage.
After : liste de noms d’unités qui doivent être lancées après le démarrage réussi de ce service, si elles ne sont pas déjà en cours d’exécution.
Type : « simple ». systemd considérera que ce service a démarré dès que le processus spécifié par ExecStart a été exécuté.
ExecStart : chemin vers le processus à lancer.
Restart : condition de redémarrage du service. Ici, nous avons spécifié « on-failure », soit « en cas d’échec ».
RestartSec : temps d’attente, en secondes, avant de tenter de redémarrer le service.
KillMode : définit comment systemd doit arrêter le processus si nous demandons à systemctl d’arrêter le service. « process » indique à systemd d’utiliser le signal SIGTERM uniquement sur le processus principal. Si notre service était un programme plus complexe, nous le définirions sur « mixed » pour garantir l’arrêt de tous les processus enfants.
WantedBy : cette entrée est définie sur « multi-user.target », ce qui signifie que le service doit être lancé tant que le système est dans un état où plusieurs utilisateurs peuvent se connecter, avec ou sans interface graphique.
Le fichier d’unité n’a pas besoin d’être exécutable, mais ses permissions doivent être restrictives pour limiter qui peut le modifier. Il est important qu’un utilisateur malveillant ne puisse pas modifier ce fichier pour lancer un programme indésirable.
La commande suivante octroie au propriétaire les droits de lecture et d’écriture, et les droits de lecture au groupe. Aucun droit n’est accordé aux autres.
sudo chmod 640 /etc/systemd/system/htg.service
Nous pouvons demander à systemctl de vérifier la syntaxe de notre fichier d’unité, même si le service n’est pas encore en cours d’exécution. Toute erreur sera signalée. (En réalité, la partie « .service » est optionnelle pour la plupart des commandes.)
systemctl status htg.service
Aucune erreur n’est affichée, ce qui confirme que notre fichier d’unité est syntaxiquement correct.
Démarrage du service
Après avoir ajouté un nouveau fichier d’unité ou modifié un fichier existant, il est impératif de signaler à systemd de recharger les définitions de fichiers d’unité.
sudo systemctl daemon-reload
Pour qu’un service soit lancé au démarrage, il faut l’activer :
sudo systemctl enable htg
L’activation d’un service ne le démarre pas, mais le programme pour un démarrage automatique lors du prochain redémarrage. Pour démarrer le service immédiatement, utilisez systemctl avec l’option « start ».
sudo systemctl start htg
Vérification du service
Après un démarrage manuel du service ou après un redémarrage de l’ordinateur, nous allons vérifier que notre service fonctionne correctement.
sudo systemctl status htg.service
L’état du service est affiché.
Le point vert indique que notre service est opérationnel.
Le nom du service est « htg.service » et la description est celle que nous avons fournie dans le fichier d’unité.
On nous indique quel fichier d’unité a été chargé, à savoir « /etc/systemd/system/htg.service ».
Le service est actif, avec l’heure de son démarrage.
Son PID est 7762.
Deux tâches sont associées au service.
Le service utilise un total de 928 kibioctets de mémoire.
Le groupe de contrôle inclut le script « htg.sh » et la commande sleep, lancée par « htg.sh ». La plupart du temps, c’est la commande sleep qui s’exécutera pour ce service.
Les 10 dernières entrées de journal générées par ce service sont également affichées. Elles sont toutes espacées d’une minute, comme prévu.
Arrêt et désactivation du service
Pour arrêter le service, utilisez la commande suivante :
sudo systemctl stop htg.service
Cela arrête le service, mais n’empêche pas son redémarrage lors du prochain allumage de l’ordinateur. Pour désactiver le lancement automatique au démarrage, il faut désactiver le service :
sudo systemctl disable htg.service
Si le service est en cours d’exécution, cette commande ne l’arrête pas. Elle indique simplement à systemd de ne pas lancer le service lors du prochain redémarrage.
Si vous souhaitez arrêter le service et empêcher son lancement au démarrage, utilisez les deux commandes.
Conseils de service
Avant de tenter de lancer votre programme en tant que service, assurez-vous qu’il fonctionne comme prévu.