Comment exécuter un programme Linux au démarrage avec systemd

Besoin de lancer un programme Linux au démarrage? Le logiciel systemd fournit un moyen de le faire sur n’importe quelle distribution Linux avec systemd – qui est la plupart d’entre eux de nos jours, y compris Ubuntu. Nous vous guiderons tout au long du processus de création d’un service intégré – et il communiquera même avec la revue.

Ce didacticiel montre comment configurer un service système qui se lance lorsque vous démarrez votre système. Pour lancer un programme graphique lorsque vous vous connectez, utilisez plutôt le gestionnaire de démarrage de votre bureau.

Exécution de programmes au démarrage

Parfois, le logiciel que vous installez sur votre ordinateur se connecte au processus de démarrage Linux, de sorte que le programme est automatiquement lancé à chaque démarrage de l’ordinateur. Vous pouvez facilement obtenir ce même comportement avec vos propres programmes et scripts, ou en fait tout autre programme présent sur votre ordinateur.

Les programmes lancés au démarrage sont contrôlés par systemd, le système et service directeur. systemd est le premier processus à exécuter au démarrage. Il a toujours ID de processus (PID) 1. Tous les autres processus exécutés sur votre ordinateur sont démarrés par systemd ou par un processus que systemd a déjà démarré.

Les programmes qui s’exécutent en arrière-plan sont appelés démons ou services. Le «d» à la fin de systemd signifie démon. Dans cet article, nous allons créer un exemple de service. Pour cocher toutes les cases, notre service doit être:

Intégré à systemd via un fichier d’unité de service
Lancé au démarrage
Contrôlable à l’aide de systemctl, le interface de contrôle pour systemd
Capable d’écrire dans le journal

Création du programme de service

Nous avons besoin d’un programme que systemd lancera. Nous allons créer un script simple, appelé «htg.sh». Ce didacticiel utilise l’éditeur de texte Gedit, mais vous pouvez utiliser l’éditeur de texte de votre choix.

touch htg.sh
gedit htg.sh

touchez htg.sh dans une fenêtre de terminal

L’éditeur gedit s’ouvre. Copiez et collez le texte suivant dans l’éditeur.

#!/bin/bash

echo "htg.service: ## Starting ##" | systemd-cat -p info

while :
do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p info
sleep 60
done

Enregistrez vos modifications et fermez l’éditeur.

  Comment changer votre page d'accueil dans Microsoft Edge

Script htg.sh dans l'éditeur gedit

Le script ne fait pas grand-chose, mais il y a quelques points à noter.

Les deux lignes d’écho sont acheminées via systemd-cat, un programme qui prend le sortie d’un programme et l’envoie au journal. Les inscriptions au journal sont prioritaires. Nous utilisons l’option -p (priorité) pour indiquer que nos messages sont à titre informatif (info) uniquement. Ce ne sont pas des erreurs ou des avertissements importants.
Il y a une boucle while sans fin.
La variable TIMESTAMP est définie sur la date et l’heure actuelles. Ceci est formaté dans un message et envoyé au journal.
Le script se met alors en veille pendant 60 secondes.
Après 60 secondes, la boucle est répétée. Ainsi, ce script écrit un message horodaté dans le journal une fois par minute.

Nous allons copier le script dans le répertoire / usr / local / bin.

sudo cp htg.sh /usr/local/bin

sudo cp htg.sh / usr / local / bin dans une fenêtre de terminal

Et nous devons le rendre exécutable:

sudo chmod +x /usr/local/bin/htg.sh

sudo chmod + x /usr/local/bin/htg.sh dans une fenêtre de terminal

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. Cela contient certains attributs que systemd peut utiliser pour localiser et lancer le programme, et pour définir certains de ses comportements.

Nous devons créer un fichier d’unité pour notre nouveau service, mais il est prudent de s’assurer qu’aucun des fichiers d’unité existants ne porte le nom que nous voulons donner à notre nouveau service.

sudo systemctl list-unit-files --type-service

sudo systemctl list-unit-files --type-service dans une fenêtre de terminal

Vous pouvez faire défiler la liste des fichiers d’unité, qui est triée par ordre alphabétique, et vérifier que le nom que vous souhaitez utiliser n’est pas pris.

Liste des fichiers d'unité systemd dans une fenêtre de terminal

Notre service s’appellera «htg.service». Aucun fichier d’unité n’a ce nom, nous pouvons donc continuer et créer notre fichier d’unité.

sudo gedit /etc/systemd/system/htg.service

sudo gedit /etc/systemd/system/htg.service dans une fenêtre de terminal

L’éditeur gedit s’ouvre. Copiez et collez le texte suivant dans l’éditeur:

[Unit]
Description=toptips.fr Service Example

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.

fichier d'unité htg.service dans l'éditeur gedit

Les entrées ont ces significations. Ce sont des entrées typiques. Notre service simple n’a pas besoin de la plupart d’entre eux, mais les inclure nous permet de les expliquer.

  Comment installer Notes sur Linux

Description: il s’agit d’une description textuelle de votre service.
Veut: notre service veut – mais n’exige pas – que le réseau soit opérationnel avant le démarrage de notre service.
Après: une liste de noms d’unités qui doivent être démarrés après le démarrage réussi de ce service, s’ils 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é forké.
ExecStart: chemin vers le processus qui doit être démarré.
Redémarrer: quand et si le service doit être redémarré. Nous l’avons défini sur «en cas d’échec».
RestartSec: combien de temps attendre avant de tenter de redémarrer le service. Cette valeur est en secondes.
KillMode: définit comment systemd doit tuer le processus si nous demandons à systemctl d’arrêter le service. Nous avons cet ensemble pour «traiter». Cela amène systemd à utiliser le signal SIGTERM uniquement sur le processus principal. Si notre service était un programme non trivial au lieu d’un simple script, nous le définirions sur «mixte» pour garantir que tous les processus générés soient également arrêtés.
WantedBy: Nous avons défini ce paramètre sur «multi-user.target», ce qui signifie que le service doit être démarré tant que le système est dans un état où plusieurs utilisateurs peuvent se connecter, qu’une interface utilisateur graphique soit disponible ou non.

Le fichier d’unité n’a pas besoin d’être exécutable, mais les autorisations sur le fichier d’unité doivent restreindre qui peut le modifier. Vous ne voulez pas qu’un utilisateur malveillant ou malicieux modifie le fichier unité pour qu’il exécute un programme complètement différent.

Cette commande donnera au propriétaire des autorisations de lecture et d’écriture et des autorisations de lecture sur le groupe. D’autres n’auront aucune autorisation.

sudo chmod 640 /etc/systemd/system/htg.service

sudo chmod 640 /etc/systemd/system/htg.service dans une fenêtre de terminal

Nous pouvons demander à systemctl de vérifier la syntaxe de notre fichier d’unité pour nous, même si le service n’est pas encore en cours d’exécution. Toute erreur sera signalée. (En fait, la partie «.service» est facultative pour la plupart des commandes.)

systemctl status htg.service

systemctl status htg.service dans une fenêtre de terminal

Aucune erreur n’est mise en évidence, ce qui signifie que notre fichier d’unité est syntaxiquement correct.

  Comment ajouter un bouton d'action personnalisé aux paramètres rapides dans Android 6.0

Démarrage du service

Lorsque vous ajoutez un nouveau fichier d’unité ou modifiez un fichier existant, vous devez dire à systemd de recharger les définitions de fichier d’unité.

sudo systemctl daemon-reload

Si vous souhaitez qu’un service soit lancé au démarrage, vous devez l’activer:

sudo systemctl enable htg

L’activation d’un service ne le démarre pas, mais le définit uniquement pour qu’il soit lancé au démarrage. Pour démarrer le service maintenant, vous devez utiliser systemctl avec l’option de démarrage.

sudo systemctl start htg

sudo systemctl daemon-reload dans une fenêtre de terminal

Vérification du service

Après le démarrage manuel du service ou après le redémarrage de l’ordinateur, nous pouvons vérifier que notre service fonctionne correctement.

sudo systemctl status htg.service

sudo systemctl status htg.service dans une fenêtre de terminal

Le statut du service est affiché pour nous.

Statut du service htg.service dans une veuve de terminal

Le point vert signifie que notre service fonctionne correctement.
Le nom du service est «htg.service», et la description longue est celle que nous avons fournie dans le fichier d’unité.
On nous montre quel fichier d’unité a été chargé « /etc/systemd/system/htg.service ».
Le service est actif et l’heure à laquelle le service a été lancé est indiquée pour nous.
Son PID est 7762.
Il existe deux tâches associées au service.
Un total de 928 Kibibytes de mémoire sont utilisés par le service.
Le groupe de contrôle comprend le script «htg.sh» et la commande sleep, qui a été lancée par «htg.sh». La plupart du temps, la commande sleep effectuera le travail pour ce service.

On nous montre également les 10 dernières entrées de journal produites par ce service. Sans surprise, ils sont tous séparés d’une minute.

Arrêt et désactivation du service

Si vous devez arrêter le service, vous pouvez le faire avec cette commande:

sudo systemctl stop htg.service

sudo systemctl stop htg.service dans une fenêtre de terminal

Cela arrête le service, mais cela ne l’empêche pas de redémarrer la prochaine fois que l’ordinateur est redémarré. Pour arrêter le lancement du service au démarrage, vous devez le désactiver:

sudo systemctl disable htg.service

sudo systemtctl désactiver htg.service dans une fenêtre de terminal

Si le service est en cours d’exécution, cette commande ne l’arrête pas. Il dit simplement à systemd de ne pas lancer le service au prochain redémarrage.

Si vous souhaitez arrêter le service et l’empêcher de se lancer au démarrage, utilisez les deux commandes.

Conseil de service

Assurez-vous que votre programme s’exécute comme prévu avant d’essayer de le lancer en tant que service.