Linux : systemctl daemon-reload

LinuxBeginner
Pratiquer maintenant

Introduction

Ce tutoriel vous guidera tout au long du processus d'utilisation de la commande systemctl daemon-reload pour gérer les démons et les services système sur votre système Linux. Systemd est le gestionnaire de services par défaut pour la plupart des distributions Linux modernes, et comprendre comment mettre à jour correctement les configurations des services est une compétence essentielle pour les utilisateurs et les administrateurs Linux.

Dans ce laboratoire (Lab), vous apprendrez quand et pourquoi utiliser la commande systemctl daemon-reload, créer et modifier des fichiers de service, et appliquer les modifications de configuration sans perturber le fonctionnement de votre système. À la fin de ce tutoriel, vous serez à l'aise avec les services systemd et saurez appliquer efficacement les modifications de configuration.

Ce LabEx nécessite une connexion Internet pour l'apprentissage, seuls les utilisateurs LabEx Pro peuvent démarrer la machine virtuelle (VM). Passez à l'offre Pro.

Comprendre les bases de systemd et systemctl

Systemd est le gestionnaire de services et de système pour la plupart des distributions Linux modernes, y compris Ubuntu 22.04 que nous utilisons dans ce laboratoire. Il est responsable du lancement et de la gestion des services système, et systemctl est l'outil de ligne de commande principal utilisé pour interagir avec systemd.

Qu'est-ce qu'un démon du système?

Un démon est un processus d'arrière-plan qui s'exécute en continu sur votre système Linux. Ces processus effectuent diverses tâches telles que le serveur de pages web (Apache, Nginx), la gestion de bases de données (MySQL, PostgreSQL) ou la gestion d'événements système. Systemd gère ces démon à travers des fichiers de configuration standardisés appelés "fichiers d'unité".

Commandes de base de systemctl

Commençons par explorer quelques commandes de base de systemctl pour comprendre l'état actuel de votre système :

  1. Ouvrez un terminal en cliquant sur l'icône Terminal.

  2. Liste tous les services système actifs avec la commande suivante :

systemctl list-units --type=service
systemctl list-units --type=service

Cette commande affiche tous les services actuellement actifs sur votre système. Vous devriez voir une sortie similaire à :

UNIT                                      LOAD   ACTIVE SUB     DESCRIPTION
accounts-daemon.service                   chargé actif exécutant Service de comptes
apparmor.service                          chargé actif terminé Initialisation d'AppArmor
avahi-daemon.service                      chargé actif exécutant Empilement mDNS/DNS-SD Avahi
...

Appuyez sur Ctrl+C ou Q pour quitter la commande.

  1. Vérifiez l'état d'un service spécifique, par exemple le service SSH :
systemctl status ssh
systemctl status ssh

Vous devriez voir des informations détaillées sur le service SSH, y compris s'il est actif, son identifiant de processus et les entrées de journal récentes :

● ssh.service - Serveur de shell sécurisé OpenBSD
     Chargé : chargé (/lib/systemd/system/ssh.service ; activé ; paramètre fourni par le fabricant : activé)
     Actif  : actif (en cours d'exécution) depuis mar. 2023-06-13 12:34:56 UTC ; il y a 3h 25min
       Docs: man:sshd(8)
             man:sshd_config(5)
    Processus: 1234 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
   PID principal: 1235 (sshd)
      Tâches: 1 (limite : 4915)
     Mémoire : 5,6M
        CPU : 236ms
     Groupe de contrôle: /system.slice/ssh.service
             └─1235 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
  1. Examnons où sont stockés les fichiers de service systemd. Ce sont les fichiers avec lesquels nous allons travailler dans les étapes suivantes :
ls -l /etc/systemd/system/

Ce répertoire contient les fichiers d'unité de service qui définissent la manière dont systemd gère les services. Vous devriez voir plusieurs fichiers .service et des liens symboliques.

  1. Les fichiers d'unité fournis par le système sont situés dans un répertoire différent. Examnons-les :
ls -l /lib/systemd/system/

Ce répertoire contient les fichiers d'unité de service par défaut fournis avec votre système.

Maintenant que vous comprenez les bases de systemd et la manière de vérifier l'état des services, vous êtes prêt à créer et modifier les fichiers de service dans l'étape suivante.

Création d'un fichier de service systemd simple

Dans cette étape, vous allez créer un fichier de service systemd simple qui exécutera un script personnalisé. Cela vous aidera à comprendre comment fonctionnent les fichiers de service et comment les modifier.

Création d'un script simple

Tout d'abord, créons un script simple que notre service exécutera :

  1. Créez un répertoire pour votre script :
mkdir -p ~/project/scripts
  1. Utilisez l'éditeur de texte nano pour créer un script simple :
nano ~/project/scripts/hello-service.sh
  1. Ajoutez le contenu suivant au script :
#!/bin/bash

while true; do
  echo "Hello from custom service: $(date)" >> /tmp/hello-service.log
  sleep 10
done

Appuyez sur Ctrl+X pour quitter l'éditeur, puis Y pour enregistrer le fichier, puis Entrée pour confirmer le nom du fichier.

Ce script écrit simplement un message avec la date actuelle dans un fichier de journal toutes les 10 secondes.

  1. Rendez le script exécutable :
chmod +x ~/project/scripts/hello-service.sh

Création d'un fichier d'unité de service systemd

Maintenant, créons un fichier de service systemd qui exécutera ce script :

  1. Créez un nouveau fichier de service avec les privilèges sudo :
sudo nano /etc/systemd/system/hello-service.service
  1. Ajoutez le contenu suivant au fichier de service :
[Unit]
Description=Hello Service Demo
After=network.target

[Service]
Type=simple
ExecStart=/home/labex/project/scripts/hello-service.sh
Restart=on-failure
User=labex

[Install]
WantedBy=multi-user.target

Commençons par comprendre chaque section de ce fichier :

  • [Unit]: Contient des métadonnées et des dépendances

    • Description : Une description lisible par l'homme du service
    • After : Spécifie que ce service devrait démarrer après que le réseau soit prêt
  • [Service]: Définit comment le service devrait être exécuté

    • Type=simple : Le service démarre immédiatement
    • ExecStart : La commande à exécuter (notre script)
    • Restart : Redémarre automatiquement le service s'il échoue
    • User : Le compte utilisateur pour exécuter le service
  • [Install]: Définit quand et comment le service devrait être activé

    • WantedBy : Spécifie quand le service devrait être démarré (multi-user.target signifie le fonctionnement normal du système)
  1. Enregistrez le fichier et quittez l'éditeur (appuyez sur Ctrl+X, puis Y, puis Entrée dans nano).

  2. Examnons notre nouveau fichier de service créé :

cat /etc/systemd/system/hello-service.service

Vous devriez voir le contenu que vous venez d'ajouter au fichier.

cat /etc/systemd/system/hello-service.service

Dans l'étape suivante, vous allez apprendre comment charger et démarrer ce service à l'aide de la commande systemctl daemon-reload.

Utilisation de systemctl daemon-reload pour appliquer les modifications

Maintenant que vous avez créé un fichier de service systemd, vous devez informer systemd de ce nouveau service. C'est là que la commande systemctl daemon-reload entre en jeu.

Qu'est-ce que systemctl daemon-reload?

La commande systemctl daemon-reload indique à systemd de recharger tous les fichiers de service et de mettre à jour sa configuration interne. Cela est nécessaire chaque fois que vous :

  • Créez un nouveau fichier de service
  • Modifiez un fichier de service existant
  • Supprimez un fichier de service

Sans exécuter cette commande, systemd ne reconnaîtra pas vos modifications.

Recharger la configuration de systemd

  1. Exécutez la commande suivante pour recharger la configuration de systemd :
sudo systemctl daemon-reload

Cette commande ne produit pas de sortie lorsqu'elle est exécutée avec succès, mais elle met à jour la configuration interne de systemd.

  1. Maintenant, vérifions si systemd reconnaît notre nouveau service :
systemctl status hello-service

Vous devriez voir une sortie montrant que le service est chargé mais inactif :

● hello-service.service - Hello Service Demo
     Chargé : chargé (/etc/systemd/system/hello-service.service ; désactivé ; paramètre fourni par le fabricant : activé)
     Actif  : inactif (mort)

Démarrer le service

  1. Démarrons notre service :
sudo systemctl start hello-service
  1. Vérifions à nouveau l'état pour voir s'il est en cours d'exécution :
systemctl status hello-service
systemctl status hello-service

Vous devriez maintenant voir que le service est actif et en cours d'exécution :

● hello-service.service - Hello Service Demo
     Chargé : chargé (/etc/systemd/system/hello-service.service ; désactivé ; paramètre fourni par le fabricant : activé)
     Actif  : actif (en cours d'exécution) depuis [horodatage] ; il y a [durée]
   PID principal: [numéro de PID] (hello-service.sh)
      Tâches: 2 (limite : 4915)
     Mémoire : 592,0K
        CPU : 5ms
     Groupe de contrôle: /system.slice/hello-service.service
             └─[numéro de PID] /bin/bash /home/labex/project/scripts/hello-service.sh
  1. Vérifions que notre service fonctionne effectivement en consultant le fichier de journal qu'il crée :
cat /tmp/hello-service.log

Vous devriez voir plusieurs lignes de sortie similaires à :

Hello from custom service: Wed Jun 14 15:30:45 UTC 2023
Hello from custom service: Wed Jun 14 15:30:55 UTC 2023
Hello from custom service: Wed Jun 14 15:31:05 UTC 2023

Les entrées de journal montreront la date et l'heure actuelles, confirmant que notre service est en cours d'exécution et exécute le script comme prévu.

  1. Activez le service pour qu'il démarre automatiquement au démarrage du système :
sudo systemctl enable hello-service

Vous devriez voir une sortie similaire à :

Created symlink /etc/systemd/system/multi-user.target.wants/hello-service.service → /etc/systemd/system/hello-service.service.

Cela signifie que le service est désormais activé et démarrera automatiquement lorsque le système démarrera.

Maintenant, vous avez créé avec succès un service, utilisé systemctl daemon-reload pour informer systemd de son existence et démarré le service. Dans l'étape suivante, vous allez modifier le service et appliquer les modifications.

Modification de la configuration du service

Dans cette étape, vous allez modifier la configuration de votre service et appliquer les modifications à l'aide de systemctl daemon-reload. Cela démontrera l'importance de cette commande lors de la mise à jour des configurations de service.

Modification du fichier de service

Modifions notre service pour changer la fréquence à laquelle il enregistre des messages :

  1. Éditez le fichier de service :
sudo nano /etc/systemd/system/hello-service.service
  1. Ajoutez une nouvelle variable d'environnement à la section [Service] pour contrôler l'intervalle de sommeil. Ajoutez cette ligne après la ligne User=labex :
Environment="SLEEP_INTERVAL=5"
  1. Enregistrez et quittez le fichier (appuyez sur Ctrl+X, puis Y, puis Entrée dans nano).

  2. Maintenant, éditez le script pour utiliser cette variable d'environnement :

nano ~/project/scripts/hello-service.sh
  1. Modifiez le script pour utiliser la variable d'environnement (remplacez le contenu complet par ceci) :
#!/bin/bash

## Utilise 10 secondes par défaut si la variable d'environnement n'est pas définie
INTERVAL=${SLEEP_INTERVAL:-10}

while true; do
  echo "Hello from custom service: $(date) - Interval: ${INTERVAL}s" >> /tmp/hello-service.log
  sleep $INTERVAL
done
  1. Enregistrez et quittez l'éditeur (appuyez sur Ctrl+X, puis Y, puis Entrée dans nano).

Application des modifications

Maintenant que vous avez apporté des modifications au fichier de service et au script, vous devez appliquer ces modifications :

  1. Tout d'abord, rechargez la configuration de systemd :
sudo systemctl daemon-reload
  1. Ensuite, redémarrez le service pour appliquer les modifications :
sudo systemctl restart hello-service
  1. Vérifiez l'état du service :
systemctl status hello-service

Vous devriez voir que le service est en cours d'exécution avec la configuration mise à jour.

  1. Vérifiez que les modifications ont eu effet en consultant le fichier de journal :
sleep 15 ## Attendez pour collecter quelques entrées de journal
cat /tmp/hello-service.log | tail -5

Vous devriez maintenant voir que le service enregistre des messages toutes les 5 secondes au lieu de 10, et les entrées de journal devraient inclure les nouvelles informations sur l'intervalle :

Hello from custom service: Wed Jun 14 15:45:10 UTC 2023 - Interval: 5s
Hello from custom service: Wed Jun 14 15:45:15 UTC 2023 - Interval: 5s
Hello from custom service: Wed Jun 14 15:45:20 UTC 2023 - Interval: 5s
cat /tmp/hello-service.log | tail -5

Comprendre ce qui s'est passé

Commençons par comprendre ce qui vient de se passer :

  1. Vous avez modifié le fichier de service pour ajouter une variable d'environnement.
  2. Vous avez mis à jour le script pour utiliser cette variable d'environnement.
  3. Vous avez exécuté systemctl daemon-reload pour informer systemd des modifications apportées au fichier de service.
  4. Vous avez redémarré le service pour appliquer ces modifications.

Sans la commande systemctl daemon-reload, systemd n'aurait pas reconnu les modifications apportées au fichier de service, et la variable d'environnement n'aurait pas été transmise au script lors du redémarrage du service.

Cela démontre pourquoi systemctl daemon-reload est essentielle chaque fois que vous modifiez des fichiers de service - elle assure que systemd est au courant de vos modifications avant que vous tentiez de les appliquer en démarrant ou en redémarrant des services.

Dépannage et meilleures pratiques

Dans cette dernière étape, vous allez apprendre à identifier les problèmes courants qui peuvent se produire lors de la manipulation des services systemd et à les résoudre. Vous allez également découvrir quelques meilleures pratiques pour travailler avec systemctl daemon-reload.

Dépannage des problèmes courants

1. Le service ne démarre pas

Si votre service ne démarre pas, la première étape est de vérifier son état :

systemctl status hello-service

Cela fournit souvent des informations d'erreur détaillées. Créons intentionnellement une erreur pour voir comment la résoudre :

  1. Éditez le fichier de service :
sudo nano /etc/systemd/system/hello-service.service
  1. Modifiez la ligne ExecStart pour pointer vers un script qui n'existe pas :
ExecStart=/home/labex/project/scripts/non-existent.sh
  1. Enregistrez et quittez l'éditeur.

  2. Rechargez la configuration de systemd et essayez de redémarrer le service :

sudo systemctl daemon-reload
sudo systemctl restart hello-service
  1. Vérifiez l'état pour voir l'erreur :
systemctl status hello-service

Vous devriez voir des messages d'erreur indiquant que le script n'existe pas :

● hello-service.service - Hello Service Demo
     Chargé : chargé (/etc/systemd/system/hello-service.service ; activé ; paramètre fourni par le fabricant : activé)
     Actif  : échoué (Résultat : code de sortie) depuis [horodatage] ; il y a [durée]
    Processus: [pid] ExecStart=/home/labex/project/scripts/non-existent.sh (code=exited, status=203/EXEC)
   PID principal: [pid] (code=exited, status=203/EXEC)
        CPU : 5ms

[horodatage] systemd[1]: Started Hello Service Demo.
[horodatage] systemd[pid]: hello-service.service: Échec d'exécution de la commande : Aucun fichier ou dossier de ce type
[horodatage] systemd[pid]: hello-service.service: Échec à l'étape EXEC lors de la génération de /home/labex/project/scripts/non-existent.sh : Aucun fichier ou dossier de ce type
[horodatage] systemd[1]: hello-service.service: Le processus principal est sorti, code=exited, status=203/EXEC
[horodatage] systemd[1]: hello-service.service: Échoué avec le résultat 'code de sortie'.
  1. Corrigez le fichier de service pour pointer à nouveau vers le bon script :
sudo nano /etc/systemd/system/hello-service.service
  1. Changez la ligne ExecStart pour qu'elle soit à nouveau :
ExecStart=/home/labex/project/scripts/hello-service.sh
  1. Enregistrez et quittez, puis rechargez et redémarrez :
sudo systemctl daemon-reload
sudo systemctl restart hello-service
  1. Vérifiez que le service est à nouveau en cours d'exécution :
systemctl status hello-service

2. Lecture des journaux pour plus d'informations

Lors du dépannage, vous pouvez utiliser journalctl pour afficher les journaux détaillés :

sudo journalctl -u hello-service

Cela affiche tous les journaux de l'unité hello-service, qui peuvent être précieux pour diagnostiquer les problèmes.

Pour voir seulement les journaux les plus récents :

sudo journalctl -u hello-service -n 20

Pour suivre les journaux en temps réel (similaire à tail -f) :

sudo journalctl -u hello-service -f

Appuyez sur Ctrl+C pour quitter le mode de suivi des journaux.

Meilleures pratiques pour travailler avec systemctl daemon-reload

Voici quelques meilleures pratiques à suivre lorsqu'on travaille avec systemd et la commande daemon-reload :

  1. Toujours recharger après les modifications : Toujours exécutez systemctl daemon-reload après avoir modifié, ajouté ou supprimé des fichiers d'unité systemd.

  2. Vérifiez la syntaxe avant d'appliquer : Vous pouvez utiliser la commande suivante pour vérifier les erreurs de syntaxe dans vos fichiers de service avant de recharger :

sudo systemd-analyze verify /etc/systemd/system/hello-service.service

Si il n'y a pas d'erreurs, cette commande ne produit pas de sortie. Toute erreur de syntaxe sera signalée.

  1. Utilisez des modèles de service : Pour les services qui nécessitent plusieurs instances, utilisez des modèles de service (fichiers nommés comme service@.service) pour éviter les duplications.

  2. Vérifiez les dépendances des services : Assurez-vous que vos services ont les directives After= et Requires= correctes pour vous assurer qu'ils démarrent dans le bon ordre.

  3. Nettoyez correctement : Lorsque vous supprimez un service, assurez-vous de l'arrêter et de le désactiver avant de supprimer le fichier de service :

sudo systemctl stop hello-service
sudo systemctl disable hello-service
sudo rm /etc/systemd/system/hello-service.service
sudo systemctl daemon-reload

Nettoyons maintenant notre service d'exemple :

sudo systemctl stop hello-service
sudo systemctl disable hello-service

Vous devriez voir une sortie indiquant que le lien symbolique a été supprimé :

Removed /etc/systemd/system/multi-user.target.wants/hello-service.service.

Nous ne supprimerons pas le fichier de service pour le moment car nous en avons encore besoin pour la vérification.

Maintenant, vous comprenez comment créer, modifier et résoudre les problèmes des services systemd, ainsi que l'importance de la commande systemctl daemon-reload dans la gestion de ces services.

Sommaire

Dans ce laboratoire, vous avez appris à utiliser la commande systemctl daemon-reload pour gérer les démon de système et les services sur votre système Linux. Vous avez :

  • Compris les bases de systemd et systemctl
  • Créé un fichier de service systemd personnalisé
  • Utilisé systemctl daemon-reload pour appliquer des modifications aux configurations de service
  • Modifié les fichiers de service et appliqué ces modifications
  • Appris à résoudre les problèmes courants et à suivre les meilleures pratiques

La commande systemctl daemon-reload est essentielle lorsqu'on travaille avec les services systemd, car elle assure que le gestionnaire systemd est au courant de toutes les modifications que vous apportez aux configurations de service. Sans cette commande, vos modifications aux fichiers de service ne seraient pas reconnues par le système avant le prochain redémarrage.

Ces connaissances seront précieuses lorsque vous continuerez à travailler avec des systèmes Linux, vous permettant de gérer efficacement les services et d'assurer que vos modifications de configuration sont correctement appliquées.