Agence web » Actualités du digital » Comment exécuter un programme Linux au démarrage avec systemd

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 ordinateur.

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 gestionnaire du système et des services. systemd est le premier processus à 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 qui systemd a déjà commencé.

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é avec systemd via un fichier d'unité de service
  • Lancé au démarrage
  • Contrôlable en utilisant systemctl, l'interface de contrôle pour systemd
  • Capable d'écrire dans le journal

Création du programme de service

Nous devons avoir un programme qui systemd Va lancer. 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

le gedit l'éditeur s'ouvrira. 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.

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

  • Les deux echo les lignes sont canalisées systemd-cat, un programme qui prend la sortie d'un programme et l'envoie au journal. Les inscriptions au journal sont prioritaires. Nous utilisons le -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 un sans fin while boucle.
  • le TIMESTAMP variable 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 copierons le script dans le /usr/local/bin annuaire.

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 lancé par systemd a un fichier de définition, appelé fichier d'unité de service. Cela contient certains attributs qui 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 d'unité, qui est triée par ordre alphabétique, et vérifier que le nom que vous souhaitez utiliser n'est pas pris.

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

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

(Unit)
Description=How-To Geek 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.

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.

  • La description: Ceci est une description textuelle de votre service.
  • Veut: Notre service veut – mais ne nécessite 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 démarrés après le démarrage de ce service, s'ils ne sont pas déjà en cours d'exécution.
  • Type: Facile. systemd considérera ce service démarré dès que le processus spécifié par ExecStart a été fourchu.
  • ExecStart: Le 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 devrait tuer le processus si nous demandons systemctl pour arrêter le service. Nous avons cet ensemble pour «traiter». Ce qui provoque systemd utiliser le SIGTERM signal sur le processus principal uniquement. 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 terminés.
  • Recherché par: 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 de l’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

Nous pouvons avoir systemctl vérifiez 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

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 dire systemd pour 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 activer il:

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, Tu dois utiliser systemctl avec le start option.

sudo systemctl start htg

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

Le statut du service est affiché pour nous.

  • 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é.
  • Nous montrons 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 Ko de mémoire est utilisé par le service.
  • Le groupe de contrôle comprend le script «htg.sh» et le sleep commande, qui a été lancée par «htg.sh». La plupart du temps, le sleep commande effectuera le travail pour ce service.

On nous montre également les 10 dernières écritures 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

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 désactiver il:

sudo systemctl disable htg.service

Si le service est en cours d’exécution, cette commande ne l’arrête pas. Il raconte 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.

★★★★★