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

Publié: 2022-01-29
Une fenêtre de terminal stylisée sur un ordinateur portable.
Fatmawati Achmad Zaenuri/Shutterstock

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, ce 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 parlera même au journal.

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écuter des programmes au démarrage

Parfois, le logiciel que vous installez sur votre ordinateur s'accroche au processus de démarrage de 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 avec tout autre programme installé sur votre ordinateur.

Les programmes lancés au démarrage sont contrôlés par systemd , le gestionnaire de système et de service. systemd est le premier processus à s'exécuter au démarrage. Il a toujours l'ID de processus (PID) 1. Tous les autres processus en cours d'exécution 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 systemctl , l'interface de contrôle de systemd
  • Capable d'écrire au 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.

 toucher htg.sh
 gedit htg.sh 

Publicité

L'éditeur gedit s'ouvrira. Copiez et collez le texte suivant dans l'éditeur.

 #!/bin/bash

echo "htg.service : ## Démarrage ##" | systemd-cat -p infos

tandis que :
faire
HORODATAGE=$(date '+%Y-%m-%d %H:%M:%S')
echo "htg.service : horodatage ${TIMESTAMP}" | systemd-cat -p infos
dormir 60
Fini

Enregistrez vos modifications et fermez l'éditeur.

Script htg.sh dans l'éditeur gedit

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

  • Les deux lignes echo sont acheminées via systemd-cat , un programme qui prend la sortie d'un programme et l'envoie au journal. Les entrées 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 dort ensuite 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 /usr/local/bin .

 sudo cp htg.sh /usr/local/bin 

Et nous devons le rendre exécutable:

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

Création du fichier d'unité de service

Chaque programme démarré 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 

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

Publicité

Notre service va s'appeler "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 

L'éditeur gedit s'ouvrira. Copiez et collez le texte suivant dans l'éditeur :

 [Unité]
Description=Exemple de service Geek pratique

Veut=réseau.cible
Après=syslog.target network-online.target

[Un service]
Genre=simple
ExecStart=/usr/local/bin/htg.sh
Redémarrer = en cas d'échec
RestartSec=10
KillMode=processus

[Installer]
WantedBy=multi-utilisateur.cible

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 réellement besoin de la plupart d'entre eux, mais les inclure nous permet de les expliquer.

  • Description : Il s'agit d'une description textuelle de votre service.
  • Veut : notre service souhaite, mais n'exige pas, que le réseau soit opérationnel avant le démarrage de notre service.
  • Après : une liste des 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.
  • Genre : Simple. systemd considérera ce service comme démarré dès que le processus spécifié par ExecStart aura été forké.
  • ExecStart : le chemin d'accès au 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 : durée d'attente 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 oblige 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 engendrés soient également terminé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 espiègle modifie le fichier d'unité afin 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 au groupe. D'autres n'auront aucune autorisation.

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

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 statut htg.service 

Publicité

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

Démarrage du service

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

 rechargement du démon systemctl sudo

Si vous voulez qu'un service soit lancé au démarrage vous devez l' activer :

 sudo systemctl activer htg

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

 sudo systemctl démarrer htg 

Vérification du service

Après avoir démarré manuellement le service ou après avoir redémarré l'ordinateur, nous pouvons vérifier que notre service fonctionne correctement.

 sudo systemctl status htg.service 

L'état du service nous est affiché.

Statut de htg.service dans une fenêtre 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 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é nous est indiquée.
  • Son PID est 7762.
  • Deux tâches sont associées au service.
  • Un total de 928 kibioctets 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 fera le travail pour ce service.

Nous affichons également les 10 dernières entrées de journal produites par ce service. Sans surprise, ils sont tous à une minute d'intervalle.

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 

Publicité

Cela arrête le service, mais cela ne l'empêche pas de redémarrer au prochain redémarrage de l'ordinateur. Pour arrêter le lancement du service au démarrage, vous devez le désactiver :

 sudo systemctl désactiver htg.service 

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 d'entretien

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

CONNEXION: Meilleurs ordinateurs portables Linux pour les développeurs et les passionnés