Skip to content
rodolfo.gg
Go back

Guide pour l'administration des services avec systemd.

CC BY-NC-ND 4.0
Rodolfo González González

Guide pour l'administration des services avec systemd.

Introduction

Il y a bien longtemps, j’ai commencé par administrer un serveur Solaris pendant quelques mois. De là, je suis passé à Slackware, parce que c’était ce qu’il y avait. Puis à Red Hat. En ce temps-là, le cycle de vie des services était géré sans complications avec SysVinit. Cependant, à un moment donné du chemin, quelqu’un a eu l’idée de compliquer les choses.

Entrez systemd.

Et, eh bien, puisque Ubuntu, Debian et la plupart des distributions dérivées utilisent ce système, il n’y a d’autre choix que d’en apprendre un peu.


Table des matières

Table des matières

1. Introduction : qu’est-ce que systemd et qu’administre-t-il

systemd est le système d’initialisation et le gestionnaire de services prédominant dans de nombreuses distributions Linux modernes. Son processus principal s’exécute généralement en tant que PID 1 et est responsable du démarrage du système, de la gestion des services, du montage des systèmes de fichiers, du démarrage des sockets, de la planification des tâches, de la gestion des sessions, de la collecte des journaux via journald et de la coordination des dépendances entre les composants du système.

Dans l’administration quotidienne, la commande centrale est systemctl. Avec elle, les unités systemd sont interrogées, démarrées, arrêtées, activées, désactivées, redémarrées, rechargées, masquées et gérées.

Un « service » dans systemd correspond généralement à une unité avec l’extension .service, par exemple :

Cependant, systemd ne gère pas uniquement des services. Il gère différents types d’unités : services, sockets, timers, cibles, montages, automontages, chemins, tranches, portées, périphériques et espaces d’échange.

Exemple de base pour vérifier l’état d’un service :

Terminal window
systemctl status ssh.service

Explication de la commande :

Exemple alternatif :

Terminal window
systemctl status ssh

Cette commande résout généralement ssh en ssh.service, tant qu’il n’y a pas d’ambiguïté avec une autre unité du même nom et d’une extension différente.


2. Concepts fondamentaux : unités, services et cibles

2.1 Unité

Une unité est un objet géré par systemd. Chaque unité est définie par un fichier de configuration appelé fichier unit. Le nom de l’unité indique son type par son extension.

Exemples :

nginx.service
ssh.socket
apt-daily.timer
multi-user.target
home.mount

2.2 Service

Une unité .service décrit comment démarrer, arrêter, recharger et superviser un processus ou un ensemble de processus.

Exemple d’un fichier de service minimal :

[Unit]
Description=Service d'exemple
After=network.target
[Service]
ExecStart=/usr/local/bin/mon-service
Restart=on-failure
[Install]
WantedBy=multi-user.target

Explication des sections :

2.3 Cible (target)

Une cible est une unité qui regroupe d’autres unités. Elle est comparable, de façon approximative, aux anciens niveaux d’exécution (runlevels) de SysVinit.

Cibles courantes :

Afficher la cible par défaut :

Terminal window
systemctl get-default

Explication :

Définir la cible par défaut :

Terminal window
sudo systemctl set-default multi-user.target

Explication :

Exemple pour un serveur sans bureau graphique :

Terminal window
sudo systemctl set-default multi-user.target

Exemple pour un poste de travail avec environnement graphique :

Terminal window
sudo systemctl set-default graphical.target

3. Inspection de base du système et des services

Avant d’installer, de modifier ou de supprimer des services, il est utile de savoir comment inspecter l’état du système.

3.1 Lister les services actifs

Terminal window
systemctl list-units --type=service --state=running

Explication :

Exemple :

Terminal window
systemctl list-units --type=service --state=running

Utile pour vérifier quels processus sont actuellement gérés par systemd.

3.2 Lister tous les services chargés

Terminal window
systemctl list-units --type=service --all

Explication :

Exemple :

Terminal window
systemctl list-units --type=service --all

3.3 Lister les fichiers unit installés

Terminal window
systemctl list-unit-files --type=service

Explication :

La sortie inclut généralement des états tels que :

Exemple :

Terminal window
systemctl list-unit-files --type=service | grep nginx

3.4 Afficher l’état détaillé d’un service

Terminal window
systemctl status nginx.service

Explication :

Exemple :

Terminal window
systemctl status nginx.service

Sortie abrégée typique :

● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since ...
Main PID: 1234 (nginx)
Tasks: 5
Memory: 12.3M

3.5 Afficher les propriétés internes d’une unité

Terminal window
systemctl show nginx.service

Explication :

Exemple filtrant une propriété :

Terminal window
systemctl show nginx.service --property=MainPID

Explication :

Autre exemple :

Terminal window
systemctl show nginx.service --property=FragmentPath --property=DropInPaths

Explication :

3.6 Afficher le fichier unit effectif

Terminal window
systemctl cat nginx.service

Explication :

Exemple :

Terminal window
systemctl cat nginx.service

4. Installation de services

Installer un service peut signifier deux choses différentes :

  1. Installer un paquet système qui inclut son propre service systemd.
  2. Créer et installer manuellement un fichier .service pour une application personnalisée.

Cette section couvre l’installation via les gestionnaires de paquets. La création manuelle est couverte dans la section suivante.

4.1 Installer un service sur Debian, Ubuntu et dérivés

Exemple avec nginx :

Terminal window
sudo apt update
sudo apt install nginx

Explication de la première commande :

Explication de la deuxième commande :

Exemple complet :

Terminal window
sudo apt update
sudo apt install nginx
systemctl status nginx.service

Après l’installation d’un paquet, il est utile de vérifier si le service est actif ou activé :

Terminal window
systemctl is-active nginx.service
systemctl is-enabled nginx.service

Explication :

4.2 Installer un service sur Fedora, RHEL, CentOS Stream, Rocky Linux ou AlmaLinux

Exemple avec nginx :

Terminal window
sudo dnf install nginx

Explication :

Exemple complet :

Terminal window
sudo dnf install nginx
systemctl status nginx.service

Dans de nombreuses distributions de la famille Red Hat, l’installation d’un paquet n’implique pas nécessairement son démarrage ni son activation. Pour l’activer et le démarrer :

Terminal window
sudo systemctl enable --now nginx.service

Explication :

4.3 Installer un service sur Arch Linux et dérivés

Exemple avec nginx :

Terminal window
sudo pacman -Syu nginx

Explication :

Il peut ensuite être activé et démarré :

Terminal window
sudo systemctl enable --now nginx.service

4.4 Voir quels fichiers un paquet a installés

Sur Debian/Ubuntu :

Terminal window
dpkg -L nginx | grep systemd

Explication :

Exemple :

Terminal window
dpkg -L nginx | grep '\.service$'

Explication :

Sur Fedora/RHEL :

Terminal window
rpm -ql nginx | grep '\.service$'

Explication :


5. Création manuelle de services personnalisés

Lorsqu’une application ne vient pas packagée comme service systemd, une unité peut être créée manuellement.

5.1 Exemple d’application personnalisée

Supposons qu’il existe un binaire à :

/usr/local/bin/miapp

Et que nous voulons l’exécuter comme service.

Il est d’abord recommandé de créer un utilisateur système dédié :

Terminal window
sudo useradd --system --home /var/lib/miapp --create-home --shell /usr/sbin/nologin miapp

Explication :

Dans certaines distributions, le chemin de nologin peut être différent. Il peut être vérifié avec :

Terminal window
command -v nologin

5.2 Créer les répertoires pour l’application

Terminal window
sudo mkdir -p /etc/miapp /var/lib/miapp /var/log/miapp
sudo chown -R miapp:miapp /var/lib/miapp /var/log/miapp
sudo chmod 0750 /var/lib/miapp /var/log/miapp

Explication :

5.3 Créer le fichier unit

Terminal window
sudo editor /etc/systemd/system/miapp.service

Contenu suggéré :

[Unit]
Description=Mon application d'exemple
Documentation=https://example.com/docs/miapp
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=miapp
Group=miapp
WorkingDirectory=/var/lib/miapp
EnvironmentFile=-/etc/miapp/miapp.env
ExecStart=/usr/local/bin/miapp --config /etc/miapp/config.yaml
Restart=on-failure
RestartSec=5s
TimeoutStartSec=30s
TimeoutStopSec=30s
KillSignal=SIGTERM
[Install]
WantedBy=multi-user.target

Explication de [Unit] :

Explication de [Service] :

Explication de [Install] :

5.4 Recharger systemd après la création ou la modification d’une unité

Terminal window
sudo systemctl daemon-reload

Explication :

Exemple complet :

Terminal window
sudo editor /etc/systemd/system/miapp.service
sudo systemctl daemon-reload
sudo systemctl status miapp.service

5.5 Vérifier la syntaxe d’une unité

Terminal window
systemd-analyze verify /etc/systemd/system/miapp.service

Explication :

Exemple :

Terminal window
systemd-analyze verify /etc/systemd/system/miapp.service

Si la commande n’affiche aucune erreur, l’unité est probablement syntaxiquement valide.

5.6 Activer et démarrer le service personnalisé

Terminal window
sudo systemctl enable --now miapp.service

Explication :

Vérifier :

Terminal window
systemctl status miapp.service
journalctl -u miapp.service -n 50 --no-pager

Explication :


6. Démarrer, arrêter, redémarrer et recharger des services

6.1 Démarrer un service

Terminal window
sudo systemctl start nginx.service

Explication :

Exemple :

Terminal window
sudo systemctl start nginx.service
systemctl status nginx.service

6.2 Arrêter un service

Terminal window
sudo systemctl stop nginx.service

Explication :

Exemple :

Terminal window
sudo systemctl stop nginx.service
systemctl is-active nginx.service

6.3 Redémarrer un service

Terminal window
sudo systemctl restart nginx.service

Explication :

Exemple :

Terminal window
sudo nginx -t
sudo systemctl restart nginx.service

Explication :

6.4 Recharger un service sans le redémarrer

Terminal window
sudo systemctl reload nginx.service

Explication :

Exemple :

Terminal window
sudo nginx -t
sudo systemctl reload nginx.service

6.5 Recharger si possible, redémarrer sinon

Terminal window
sudo systemctl reload-or-restart nginx.service

Explication :

Exemple :

Terminal window
sudo systemctl reload-or-restart nginx.service

6.6 Redémarrer seulement si le service est déjà actif

Terminal window
sudo systemctl try-restart nginx.service

Explication :

Exemple :

Terminal window
sudo systemctl try-restart nginx.service

6.7 Recharger ou redémarrer seulement si actif

Terminal window
sudo systemctl reload-or-try-restart nginx.service

Explication :

Exemple :

Terminal window
sudo systemctl reload-or-try-restart nginx.service

6.8 Tuer les processus d’un service

Terminal window
sudo systemctl kill nginx.service

Explication :

Exemple envoyant SIGKILL :

Terminal window
sudo systemctl kill --signal=SIGKILL nginx.service

Explication :

Exemple envoyant SIGHUP :

Terminal window
sudo systemctl kill --signal=SIGHUP nginx.service

Explication :


7. Activer, désactiver, masquer et démasquer des services

Dans systemd, il est important de distinguer démarrer et activer :

7.1 Activer un service pour qu’il démarre automatiquement

Terminal window
sudo systemctl enable nginx.service

Explication :

Exemple :

Terminal window
sudo systemctl enable nginx.service
systemctl is-enabled nginx.service

7.2 Activer et démarrer en une seule étape

Terminal window
sudo systemctl enable --now nginx.service

Explication :

Exemple :

Terminal window
sudo systemctl enable --now nginx.service
systemctl status nginx.service

7.3 Désactiver un service

Terminal window
sudo systemctl disable nginx.service

Explication :

Exemple :

Terminal window
sudo systemctl disable nginx.service
systemctl is-enabled nginx.service
systemctl is-active nginx.service

7.4 Désactiver et arrêter en un seul flux

Il n’existe pas de sous-commande traditionnelle unique équivalente à « disable —now » dans toutes les versions historiques, bien que de nombreuses versions modernes acceptent disable --now. Pour une compatibilité maximale, cela peut être fait explicitement :

Terminal window
sudo systemctl disable nginx.service
sudo systemctl stop nginx.service

Explication :

Exemple utilisant --now quand disponible :

Terminal window
sudo systemctl disable --now nginx.service

Explication :

7.5 Réactiver un service

Terminal window
sudo systemctl reenable nginx.service

Explication :

Exemple :

Terminal window
sudo systemctl reenable nginx.service

7.6 Masquer un service

Terminal window
sudo systemctl mask nginx.service

Explication :

Exemple :

Terminal window
sudo systemctl mask nginx.service
systemctl status nginx.service

Sortie conceptuelle :

Loaded: masked (Reason: Unit nginx.service is masked.)

7.7 Masquer et arrêter immédiatement

Terminal window
sudo systemctl mask --now nginx.service

Explication :

Exemple :

Terminal window
sudo systemctl mask --now nginx.service

7.8 Démasquer un service

Terminal window
sudo systemctl unmask nginx.service

Explication :

Exemple :

Terminal window
sudo systemctl unmask nginx.service
sudo systemctl enable --now nginx.service

7.9 Vérifier si un service est actif ou activé

Terminal window
systemctl is-active nginx.service
systemctl is-enabled nginx.service

Explication :

Exemple dans un script :

Terminal window
if systemctl is-active --quiet nginx.service; then
echo "Nginx est actif"
else
echo "Nginx n'est pas actif"
fi

Explication :


8. Configuration des services avec les fichiers unit et les drop-ins

8.1 Ne pas modifier directement les fichiers de paquets

Les services installés par des paquets ont généralement leurs unités à des chemins tels que :

/usr/lib/systemd/system/
/lib/systemd/system/

Selon la distribution, l’un ou l’autre peut être le chemin principal. Il est déconseillé de modifier ces fichiers directement, car une mise à jour du paquet peut écraser les modifications.

L’emplacement recommandé pour les modifications locales est :

/etc/systemd/system/

8.2 Modifier un service avec un drop-in

Terminal window
sudo systemctl edit nginx.service

Explication :

Exemple pour ajouter un redémarrage automatique :

Terminal window
sudo systemctl edit nginx.service

Contenu :

[Service]
Restart=on-failure
RestartSec=3s

Ensuite :

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart nginx.service

Explication :

8.3 Modifier le fichier unit complet

Terminal window
sudo systemctl edit --full nginx.service

Explication :

Exemple :

Terminal window
sudo systemctl edit --full nginx.service
sudo systemctl daemon-reload
sudo systemctl restart nginx.service

8.4 Voir les différences entre les fichiers originaux et les surcharges

Terminal window
systemd-delta

Explication :

Exemple :

Terminal window
systemd-delta --type=extended

Explication :

Autre exemple :

Terminal window
systemd-delta nginx.service

8.5 Réinitialiser les surcharges d’une unité

Pour supprimer un drop-in créé avec systemctl edit :

Terminal window
sudo rm -rf /etc/systemd/system/nginx.service.d
sudo systemctl daemon-reload
sudo systemctl restart nginx.service

Explication :

Si systemctl edit --full a été utilisé, la copie complète doit être supprimée :

Terminal window
sudo rm -f /etc/systemd/system/nginx.service
sudo systemctl daemon-reload
sudo systemctl restart nginx.service

Explication :

8.6 Remplacer des listes dans les drop-ins

Certaines directives systemd acceptent plusieurs valeurs. Pour les remplacer complètement dans un drop-in, elles doivent d’abord être vidées.

Exemple avec ExecStart :

[Service]
ExecStart=
ExecStart=/usr/local/bin/miapp --modo produccion

Explication :

Exemple complet :

Terminal window
sudo systemctl edit miapp.service

Contenu :

[Service]
ExecStart=
ExecStart=/usr/local/bin/miapp --config /etc/miapp/prod.yaml

Appliquer :

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart miapp.service

8.7 Configurer les redémarrages automatiques

Drop-in :

[Service]
Restart=on-failure
RestartSec=10s
StartLimitIntervalSec=300
StartLimitBurst=5

Explication :

Commandes :

Terminal window
sudo systemctl edit miapp.service
sudo systemctl daemon-reload
sudo systemctl restart miapp.service

8.8 Configurer les dépendances et l’ordre de démarrage

Exemple :

[Unit]
After=network-online.target postgresql.service
Wants=network-online.target
Requires=postgresql.service

Explication :

Exemple de drop-in :

Terminal window
sudo systemctl edit miapp.service

Contenu :

[Unit]
After=network-online.target postgresql.service
Wants=network-online.target
Requires=postgresql.service

Appliquer :

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart miapp.service

9. Variables d’environnement, utilisateurs, permissions et répertoires de travail

9.1 Variables d’environnement inline

[Service]
Environment="APP_ENV=production" "APP_PORT=8080"

Explication :

Exemple :

Terminal window
sudo systemctl edit miapp.service

Contenu :

[Service]
Environment="APP_ENV=production" "LOG_LEVEL=info"

Appliquer :

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart miapp.service

9.2 Variables depuis un fichier EnvironmentFile

Fichier :

Terminal window
sudo install -d -m 0750 -o root -g miapp /etc/miapp
sudo editor /etc/miapp/miapp.env

Contenu du fichier :

Terminal window
APP_ENV=production
APP_PORT=8080
LOG_LEVEL=info

Fichier unit :

[Service]
EnvironmentFile=/etc/miapp/miapp.env

Explication :

[Service]
EnvironmentFile=-/etc/miapp/miapp.env

Exemple complet :

Terminal window
sudo editor /etc/miapp/miapp.env
sudo systemctl restart miapp.service

Note : si seul le contenu de EnvironmentFile change, redémarrer le service suffit généralement. Si le fichier unit est modifié pour ajouter ou supprimer la directive EnvironmentFile=, alors daemon-reload est requis.

9.3 Exécuter en tant qu’utilisateur dédié

[Service]
User=miapp
Group=miapp

Explication :

Exemple de création d’utilisateur :

Terminal window
sudo useradd --system --home /var/lib/miapp --create-home --shell /usr/sbin/nologin miapp

9.4 Configurer le répertoire de travail

[Service]
WorkingDirectory=/var/lib/miapp

Explication :

Exemple :

[Service]
WorkingDirectory=/opt/miapp
ExecStart=/opt/miapp/bin/miapp

9.5 Créer automatiquement des répertoires avec systemd

systemd peut créer des répertoires runtime, d’état, de cache et de journaux pour un service.

Exemple :

[Service]
User=miapp
Group=miapp
RuntimeDirectory=miapp
StateDirectory=miapp
CacheDirectory=miapp
LogsDirectory=miapp

Explication :

Exemple d’utilisation :

[Service]
User=miapp
Group=miapp
StateDirectory=miapp
WorkingDirectory=/var/lib/miapp
ExecStart=/usr/local/bin/miapp

9.6 Utiliser DynamicUser

[Service]
DynamicUser=yes
StateDirectory=miapp
ExecStart=/usr/local/bin/miapp

Explication :

Exemple :

[Unit]
Description=Service avec utilisateur dynamique
[Service]
DynamicUser=yes
StateDirectory=miapp
ExecStart=/usr/local/bin/miapp --data-dir /var/lib/miapp
[Install]
WantedBy=multi-user.target

10. Journaux, diagnostics et résolution de problèmes

10.1 Voir les journaux d’un service

Terminal window
journalctl -u nginx.service

Explication :

Exemple :

Terminal window
journalctl -u nginx.service

10.2 Voir les dernières lignes du journal

Terminal window
journalctl -u nginx.service -n 100 --no-pager

Explication :

Exemple :

Terminal window
journalctl -u nginx.service -n 100 --no-pager

10.3 Suivre les journaux en temps réel

Terminal window
journalctl -u nginx.service -f

Explication :

Exemple :

Terminal window
journalctl -u miapp.service -f

10.4 Voir les journaux depuis le dernier démarrage

Terminal window
journalctl -u nginx.service -b

Explication :

Exemple :

Terminal window
journalctl -u nginx.service -b --no-pager

10.5 Voir les journaux d’un démarrage précédent

Terminal window
journalctl --list-boots

Explication :

Ensuite :

Terminal window
journalctl -b -1 -u nginx.service

Explication :

10.6 Voir les erreurs système

Terminal window
journalctl -p err -b

Explication :

Exemple :

Terminal window
journalctl -p warning..alert -b --no-pager

Explication :

10.7 Diagnostiquer les services en échec

Terminal window
systemctl --failed

Explication :

Exemple :

Terminal window
systemctl --failed

Voir les détails d’une unité en échec :

Terminal window
systemctl status miapp.service
journalctl -u miapp.service -b -n 200 --no-pager

10.8 Réinitialiser l’état d’échec

Terminal window
sudo systemctl reset-failed miapp.service

Explication :

Exemple :

Terminal window
sudo systemctl reset-failed miapp.service
systemctl status miapp.service

Réinitialiser tous les échecs enregistrés :

Terminal window
sudo systemctl reset-failed

10.9 Vérifier les temps de démarrage

Terminal window
systemd-analyze

Explication :

Exemple :

Terminal window
systemd-analyze blame

Explication :

Exemple avec chemin critique :

Terminal window
systemd-analyze critical-chain

Explication :

10.10 Voir l’arbre des dépendances

Terminal window
systemctl list-dependencies nginx.service

Explication :

Exemple inverse :

Terminal window
systemctl list-dependencies --reverse nginx.service

Explication :


11. Désinstallation, suppression et nettoyage des services

Cette section distingue plusieurs opérations qui sont souvent confondues.

11.1 Arrêter avant de désinstaller

Terminal window
sudo systemctl stop nginx.service

Explication :

11.2 Désactiver avant de désinstaller

Terminal window
sudo systemctl disable nginx.service

Explication :

Exemple combiné :

Terminal window
sudo systemctl disable --now nginx.service

Explication :

11.3 Désinstaller un paquet sur Debian/Ubuntu

Supprimer le paquet en conservant la configuration :

Terminal window
sudo apt remove nginx

Explication :

Supprimer le paquet et purger la configuration gérée par le paquet :

Terminal window
sudo apt purge nginx

Explication :

Supprimer les dépendances inutilisées :

Terminal window
sudo apt autoremove

Explication :

Exemple complet :

Terminal window
sudo systemctl disable --now nginx.service
sudo apt purge nginx
sudo apt autoremove

11.4 Désinstaller un paquet sur Fedora/RHEL

Terminal window
sudo dnf remove nginx

Explication :

Exemple :

Terminal window
sudo systemctl disable --now nginx.service
sudo dnf remove nginx

11.5 Désinstaller un paquet sur Arch Linux

Terminal window
sudo pacman -R nginx

Explication :

Supprimer le paquet et les dépendances inutilisées installées comme dépendances :

Terminal window
sudo pacman -Rs nginx

Explication :

Exemple :

Terminal window
sudo systemctl disable --now nginx.service
sudo pacman -Rs nginx

11.6 Supprimer un service manuel créé dans /etc/systemd/system

Supposons qu’il a été créé manuellement :

/etc/systemd/system/miapp.service

Processus recommandé :

Terminal window
sudo systemctl disable --now miapp.service
sudo rm -f /etc/systemd/system/miapp.service
sudo systemctl daemon-reload
sudo systemctl reset-failed miapp.service

Explication :

Si le service avait des drop-ins :

Terminal window
sudo rm -rf /etc/systemd/system/miapp.service.d
sudo systemctl daemon-reload

Explication :

11.7 Supprimer les données, journaux et configuration d’une application personnalisée

Après avoir supprimé le fichier unit, si l’on souhaite supprimer complètement l’application :

Terminal window
sudo rm -rf /etc/miapp /var/lib/miapp /var/log/miapp /var/cache/miapp

Explication :

Exemple plus sûr, en listant d’abord :

Terminal window
sudo find /etc/miapp /var/lib/miapp /var/log/miapp /var/cache/miapp -maxdepth 2 -print

Ensuite, si les chemins sont confirmés corrects :

Terminal window
sudo rm -rf /etc/miapp /var/lib/miapp /var/log/miapp /var/cache/miapp

11.8 Supprimer l’utilisateur et le groupe d’un service

Terminal window
sudo userdel miapp

Explication :

Si l’on souhaite également supprimer son home, selon la façon dont il a été créé :

Terminal window
sudo userdel --remove miapp

Explication :

Note : si le répertoire home était partagé, contient des données nécessaires ou se trouve dans un chemin sensible, il est conseillé de vérifier manuellement d’abord.

11.9 Nettoyer les unités orphelines ou non trouvées

Après avoir supprimé des services manuellement :

Terminal window
sudo systemctl daemon-reload
systemctl list-units --type=service --all | grep miapp

Si elle apparaît en échec :

Terminal window
sudo systemctl reset-failed miapp.service

Si elle apparaît comme masquée :

Terminal window
sudo systemctl unmask miapp.service
sudo systemctl daemon-reload

11.10 Supprimer un service masqué manuellement

Si un lien symbolique comme celui-ci existe :

/etc/systemd/system/miapp.service -> /dev/null

Il peut être démasqué :

Terminal window
sudo systemctl unmask miapp.service

Ou vérifier manuellement :

Terminal window
ls -l /etc/systemd/system/miapp.service

Si confirmé comme lien symbolique vers /dev/null :

Terminal window
sudo rm -f /etc/systemd/system/miapp.service
sudo systemctl daemon-reload

12. Services utilisateur : systemd —user

systemd peut également gérer des services par utilisateur, sans privilèges root. Ces services appartiennent à la session de l’utilisateur et sont normalement configurés sous :

~/.config/systemd/user/

12.1 Créer un service utilisateur

Terminal window
mkdir -p ~/.config/systemd/user
editor ~/.config/systemd/user/mi-tarea.service

Contenu :

[Unit]
Description=Service utilisateur d'exemple
[Service]
ExecStart=/home/usuario/bin/mi-tarea
Restart=on-failure
[Install]
WantedBy=default.target

Explication :

12.2 Recharger les unités utilisateur

Terminal window
systemctl --user daemon-reload

Explication :

12.3 Activer et démarrer un service utilisateur

Terminal window
systemctl --user enable --now mi-tarea.service

Explication :

12.4 Voir les journaux utilisateur

Terminal window
journalctl --user -u mi-tarea.service

Explication :

12.5 Permettre aux services utilisateur de persister après la déconnexion

Terminal window
loginctl enable-linger usuario

Explication :

Exemple :

Terminal window
sudo loginctl enable-linger deploy

Utile pour les services utilisateur exécutés par un compte de déploiement.

Désactiver linger :

Terminal window
sudo loginctl disable-linger deploy

13. Timers : remplacement pratique de cron pour les services périodiques

Les timers systemd permettent d’exécuter des services selon un calendrier.

13.1 Créer un service exécutable par un timer

Fichier :

Terminal window
sudo editor /etc/systemd/system/backup-miapp.service

Contenu :

[Unit]
Description=Sauvegarde de MiApp
[Service]
Type=oneshot
User=miapp
Group=miapp
ExecStart=/usr/local/bin/backup-miapp

Explication :

13.2 Créer le timer

Fichier :

Terminal window
sudo editor /etc/systemd/system/backup-miapp.timer

Contenu :

[Unit]
Description=Exécute la sauvegarde de MiApp quotidiennement
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
Unit=backup-miapp.service
[Install]
WantedBy=timers.target

Explication :

13.3 Activer et démarrer le timer

Terminal window
sudo systemctl daemon-reload
sudo systemctl enable --now backup-miapp.timer

Explication :

13.4 Lister les timers

Terminal window
systemctl list-timers --all

Explication :

Exemple :

Terminal window
systemctl list-timers --all | grep backup-miapp

13.5 Exécuter manuellement le service du timer

Terminal window
sudo systemctl start backup-miapp.service

Explication :


14. Sécurité et durcissement des services

systemd permet d’appliquer des mesures d’isolation sans modifier l’application.

14.1 Protéger le système de fichiers

Exemple de drop-in :

[Service]
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/miapp /var/log/miapp

Explication :

Appliquer :

Terminal window
sudo systemctl edit miapp.service
sudo systemctl daemon-reload
sudo systemctl restart miapp.service

14.2 Restreindre les privilèges

[Service]
NoNewPrivileges=true
PrivateTmp=true
PrivateDevices=true

Explication :

14.3 Restreindre les capacités Linux

[Service]
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE

Explication :

Exemple pour une application écoutant sur le port 80 :

[Service]
User=miapp
Group=miapp
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
ExecStart=/usr/local/bin/miapp --listen :80

14.4 Analyser la sécurité d’une unité

Terminal window
systemd-analyze security miapp.service

Explication :

Exemple :

Terminal window
systemd-analyze security nginx.service

14.5 Durcissement raisonnable d’un service personnalisé

Exemple :

[Service]
User=miapp
Group=miapp
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
ReadWritePaths=/var/lib/miapp /var/log/miapp
Restart=on-failure

Explication :


15. Bonnes pratiques opérationnelles

15.1 Utiliser des noms clairs

Pour les services personnalisés, utilisez des noms descriptifs :

miapp-api.service
miapp-worker.service
miapp-scheduler.service

Cela facilite la journalisation, la surveillance et l’administration.

15.2 Utiliser des utilisateurs dédiés

Évitez d’exécuter des services en tant que root sauf si c’est strictement nécessaire. Utilisez :

[Service]
User=miapp
Group=miapp

15.3 Séparer la configuration, les données et les binaires

Convention courante :

/usr/local/bin/miapp # binaire installé manuellement
/etc/miapp/ # configuration
/var/lib/miapp/ # données persistantes
/var/log/miapp/ # journaux propres, si applicable
/run/miapp/ # fichiers runtime temporaires

15.4 Valider avant de redémarrer

Exemple avec Nginx :

Terminal window
sudo nginx -t && sudo systemctl reload nginx.service

Explication :

Exemple avec une application personnalisée supportant la validation :

Terminal window
/usr/local/bin/miapp --check-config /etc/miapp/config.yaml && sudo systemctl restart miapp.service

15.5 Utiliser les drop-ins pour les modifications locales

Préférable :

Terminal window
sudo systemctl edit miapp.service

Éviter, sauf nécessité justifiée :

Terminal window
sudo editor /usr/lib/systemd/system/miapp.service

Raison : les fichiers sous /usr/lib/systemd/system ou /lib/systemd/system appartiennent généralement à des paquets et peuvent être écrasés par des mises à jour.

15.6 Documenter les surcharges

Un drop-in peut inclure des commentaires :

[Service]
# Redémarrage automatique pour tolérer les pannes réseau transitoires.
Restart=on-failure
RestartSec=5s

15.7 Vérifier les journaux après tout changement

Terminal window
sudo systemctl restart miapp.service
systemctl status miapp.service
journalctl -u miapp.service -b -n 100 --no-pager

15.8 Éviter rm -rf sans vérifier les chemins

Avant de supprimer des données :

Terminal window
sudo find /var/lib/miapp -maxdepth 2 -print

Ensuite, si confirmé :

Terminal window
sudo rm -rf /var/lib/miapp

15.9 Utiliser daemon-reload quand c’est approprié

Doit être utilisé après :

Commande :

Terminal window
sudo systemctl daemon-reload

Généralement pas nécessaire après avoir modifié uniquement un fichier chargé avec EnvironmentFile=, sauf si le fichier unit lui-même a changé.

15.10 Différencier reload de daemon-reload

Terminal window
sudo systemctl reload nginx.service

Recharge la configuration de Nginx.

Terminal window
sudo systemctl daemon-reload

Recharge la configuration de systemd, c’est-à-dire les fichiers unit.

Ce sont des opérations distinctes.


16. Répertoires et fichiers importants

16.1 Fichiers unit du système

/etc/systemd/system/

Utilisation :

Exemples :

/etc/systemd/system/miapp.service
/etc/systemd/system/nginx.service.d/override.conf
/etc/systemd/system/multi-user.target.wants/nginx.service

/usr/lib/systemd/system/

Utilisation :

Exemples :

/usr/lib/systemd/system/sshd.service
/usr/lib/systemd/system/docker.service

/lib/systemd/system/

Utilisation :

Exemples :

/lib/systemd/system/ssh.service
/lib/systemd/system/nginx.service

/run/systemd/system/

Utilisation :


16.2 Fichiers unit utilisateur

~/.config/systemd/user/

Utilisation :

Exemple :

/home/usuario/.config/systemd/user/mi-tarea.service

/etc/systemd/user/

Utilisation :


/usr/lib/systemd/user/

Utilisation :


16.3 Configuration générale de systemd

/etc/systemd/system.conf

Utilisation :


/etc/systemd/user.conf

Utilisation :


/etc/systemd/journald.conf

Utilisation :


/etc/systemd/logind.conf

Utilisation :


16.4 Journaux du journal

/run/log/journal/

Utilisation :


/var/log/journal/

Utilisation :

Créer un stockage de journal persistant :

Terminal window
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald.service

Explication :


16.5 Configuration des applications

/etc/<service>/

Utilisation :

Exemples :

/etc/nginx/
/etc/ssh/
/etc/postgresql/
/etc/miapp/

16.6 Données persistantes

/var/lib/<service>/

Utilisation :

Exemples :

/var/lib/postgresql/
/var/lib/mysql/
/var/lib/docker/
/var/lib/miapp/

16.7 Journaux classiques par fichier

/var/log/<service>/

Utilisation :

Exemples :

/var/log/nginx/
/var/log/apache2/
/var/log/miapp/

16.8 Fichiers runtime

/run/<service>/

Utilisation :

Exemples :

/run/nginx.pid
/run/sshd.pid
/run/miapp/

16.9 tmpfiles.d

/etc/tmpfiles.d/
/usr/lib/tmpfiles.d/
/run/tmpfiles.d/

Utilisation :

Exemple de fichier :

/etc/tmpfiles.d/miapp.conf

Contenu :

d /run/miapp 0750 miapp miapp -
d /var/log/miapp 0750 miapp miapp -

Appliquer manuellement :

Terminal window
sudo systemd-tmpfiles --create /etc/tmpfiles.d/miapp.conf

Explication :


16.10 sysusers.d

/etc/sysusers.d/
/usr/lib/sysusers.d/
/run/sysusers.d/

Utilisation :

Exemple :

/etc/sysusers.d/miapp.conf

Contenu :

u miapp - "Utilisateur système pour MiApp" /var/lib/miapp /usr/sbin/nologin

Appliquer manuellement :

Terminal window
sudo systemd-sysusers /etc/sysusers.d/miapp.conf

Explication :


16.11 Chemins liés à l’activation

Lors de l’exécution :

Terminal window
sudo systemctl enable miapp.service

systemd peut créer des liens symboliques tels que :

/etc/systemd/system/multi-user.target.wants/miapp.service -> /etc/systemd/system/miapp.service

Explication :


16.12 Fichiers d’environnement courants

Il n’existe pas d’emplacement universel unique, mais ceux-ci sont courants :

/etc/default/<service> # Debian/Ubuntu dans certains paquets
/etc/sysconfig/<service> # RHEL/Fedora dans certains paquets
/etc/<service>/<service>.env

Exemples :

/etc/default/nginx
/etc/sysconfig/sshd
/etc/miapp/miapp.env

Ces fichiers n’affectent le service que si le fichier unit possède une directive telle que :

EnvironmentFile=/etc/miapp/miapp.env

Sources de référence


Référence rapide : aide-mémoire des commandes fréquentes

Terminal window
# Voir l'état
systemctl status servicio.service
# Démarrer maintenant
sudo systemctl start servicio.service
# Arrêter maintenant
sudo systemctl stop servicio.service
# Redémarrer
sudo systemctl restart servicio.service
# Recharger la configuration du service
sudo systemctl reload servicio.service
# Activer au démarrage
sudo systemctl enable servicio.service
# Activer et démarrer maintenant
sudo systemctl enable --now servicio.service
# Désactiver au démarrage
sudo systemctl disable servicio.service
# Désactiver et arrêter maintenant
sudo systemctl disable --now servicio.service
# Masquer pour empêcher le démarrage
sudo systemctl mask servicio.service
# Démasquer
sudo systemctl unmask servicio.service
# Recharger les définitions d'unités
sudo systemctl daemon-reload
# Voir les journaux
journalctl -u servicio.service
# Voir les journaux récents
journalctl -u servicio.service -n 100 --no-pager
# Suivre les journaux en temps réel
journalctl -u servicio.service -f
# Voir les unités en échec
systemctl --failed
# Effacer l'état d'échec
sudo systemctl reset-failed servicio.service
# Voir le fichier unit effectif
systemctl cat servicio.service
# Créer une surcharge locale
sudo systemctl edit servicio.service
# Valider l'unité
systemd-analyze verify /etc/systemd/system/servicio.service

Share this post on:

Previous Post
Comment convertir un JPEG ou PNG en ICO dans la CLI Linux
Next Post
Intégration de graphiques simplifiée : Mermaid.