Aller au contenu
Administration Linux medium

Démarrer et diagnostiquer un service Linux avec systemctl

14 min de lecture

systemctl est la commande centrale pour gérer les services sous Linux. Elle permet de démarrer, arrêter, redémarrer et activer au boot n’importe quel service géré par systemd. Associée à journalctl pour les logs, elle couvre l’essentiel de l’administration des services sur un serveur moderne.

  • Comprendre les états d’un service (active, inactive, failed, masked)
  • Utiliser les commandes systemctl pour contrôler le cycle de vie d’un service
  • Activer un service au démarrage et vérifier sa persistance
  • Diagnostiquer un échec avec systemctl status et journalctl
  • Créer une unité de service personnalisée
  • Appliquer les options de sécurité systemd (sandboxing)

La gestion des services avec systemctl intervient quotidiennement en administration Linux :

  • Installer un serveur web et s’assurer qu’il redémarre automatiquement après un reboot
  • Diagnostiquer pourquoi un service de base de données ne démarre plus
  • Appliquer un changement de configuration et recharger le service sans interruption
  • Créer un service personnalisé pour une application métier
  • Durcir un service exposé sur le réseau en limitant ses privilèges

Un service systemd passe par plusieurs états au cours de son cycle de vie :

ÉtatSignification
active (running)Le service tourne normalement
active (exited)Le service a terminé son exécution avec succès (Type=oneshot)
inactive (dead)Le service est arrêté
failedLe service a échoué — consulter les logs
activatingLe service est en cours de démarrage
deactivatingLe service est en cours d’arrêt
maskedLe service est bloqué — impossible de le démarrer

Cycle de vie des états d'un service systemd : active, inactive, failed, masked

Deux notions distinctes et complémentaires :

ConceptQuestionCommande
enabledLe service démarre-t-il automatiquement au boot ?systemctl is-enabled nginx
activeLe service tourne-t-il en ce moment ?systemctl is-active nginx

Un service peut être enabled mais inactive (il sera lancé au prochain reboot). Il peut être active mais disabled (il tourne mais ne survivra pas au reboot).

Commandes systemctl essentielles : contrôle runtime (start/stop/restart) et activation boot (enable/disable)

Fenêtre de terminal
# Démarrer un service
sudo systemctl start nginx
# Arrêter un service
sudo systemctl stop nginx
# Redémarrer un service (arrêt + démarrage)
sudo systemctl restart nginx
# Recharger la configuration sans redémarrer
sudo systemctl reload nginx
Fenêtre de terminal
# Activer le démarrage automatique au boot
sudo systemctl enable nginx
# Activer ET démarrer immédiatement
sudo systemctl enable --now nginx
# Désactiver le démarrage automatique
sudo systemctl disable nginx
Fenêtre de terminal
systemctl status nginx
● 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 Sat 2026-06-28 06:32:15 CEST; 6h ago
Docs: man:nginx(8)
Process: 1234 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; ... (code=exited, status=0/SUCCESS)
Main PID: 1235 (nginx)
Tasks: 3 (limit: 4644)
Memory: 8.2M
CPU: 123ms
CGroup: /system.slice/nginx.service
├─1235 "nginx: master process /usr/sbin/nginx ..."
└─1236 "nginx: worker process"

Chaque ligne apporte une information :

LigneSignification
LoadedChemin du fichier unité + état d’activation (enabled/disabled)
ActiveÉtat actuel + depuis quand
Main PIDPID du processus principal
TasksNombre de tâches/threads
MemoryConsommation mémoire
CGroupArborescence des processus dans le cgroup
Fenêtre de terminal
# Le service est-il actif ?
systemctl is-active nginx
# active
# Le service démarre-t-il au boot ?
systemctl is-enabled nginx
# enabled
# Le service a-t-il échoué ?
systemctl is-failed nginx
# active (pas d'échec)
Fenêtre de terminal
# Afficher le fichier unité complet
systemctl cat nginx
# Afficher des propriétés spécifiques
systemctl show nginx --property=MainPID,ActiveState,SubState
MainPID=1235
ActiveState=active
SubState=running
Fenêtre de terminal
# Tous les services chargés
systemctl list-units --type=service
# Uniquement les services en échec
systemctl list-units --type=service --state=failed
# Tous les services installés (y compris désactivés)
systemctl list-unit-files --type=service

Masquer un service empêche toute tentative de démarrage — même manuelle :

Fenêtre de terminal
# Masquer un service
sudo systemctl mask bluetooth
# Démasquer
sudo systemctl unmask bluetooth

Workflow de dépannage avec journalctl : status, logs, filtrage par erreurs, correction

Quand un service est en état failed, suivez cette démarche :

  1. Lire le statut

    Fenêtre de terminal
    systemctl status mon-service

    Les dernières lignes de log apparaissent directement.

  2. Consulter les logs détaillés

    Fenêtre de terminal
    journalctl -xeu mon-service
    • -x : ajoute des explications contextuelles
    • -e : saute à la fin du journal
    • -u : filtre par unité
  3. Filtrer par niveau d’erreur

    Fenêtre de terminal
    journalctl -u mon-service -p err -b
    • -p err : uniquement les erreurs et au-dessus
    • -b : depuis le dernier démarrage
  4. Corriger et relancer

    Fenêtre de terminal
    # Corriger la configuration puis :
    sudo systemctl daemon-reload # si le fichier unité a changé
    sudo systemctl restart mon-service
    systemctl status mon-service

Pour exécuter une application métier comme un service systemd :

Fenêtre de terminal
sudo systemctl edit --full --force mon-app.service
[Unit]
Description=Mon application métier
After=network.target postgresql.service
Wants=postgresql.service
[Service]
Type=simple
User=appuser
Group=appuser
WorkingDirectory=/opt/mon-app
ExecStart=/opt/mon-app/bin/start.sh
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
SectionRôle
[Unit]Description, dépendances, ordre de démarrage
[Service]Type, commandes, utilisateur, redémarrage
[Install]Quand activer le service (target)
TypeComportement
simpleLe processus lancé par ExecStart est le processus principal (défaut)
forkingLe processus se détache (fork) — systemd suit le PID fils
oneshotExécute une commande puis se termine (scripts, tâches ponctuelles)
notifyLe processus signale à systemd qu’il est prêt via sd_notify()
idleAttend que tous les jobs soient terminés avant de démarrer
DirectiveValeurEffet
Restarton-failureRedémarre uniquement en cas d’échec (code retour ≠ 0)
RestartalwaysRedémarre dans tous les cas
RestartnoNe redémarre jamais (défaut)
RestartSec5sAttend 5 secondes avant le redémarrage
StartLimitBurst3Nombre max de redémarrages dans la fenêtre
StartLimitIntervalSec60sFenêtre de temps pour les redémarrages

systemd offre des options de sandboxing pour limiter ce qu’un service peut faire :

[Service]
# Système de fichiers en lecture seule
ProtectSystem=strict
ReadWritePaths=/var/lib/mon-app /var/log/mon-app
# Répertoire /home inaccessible
ProtectHome=true
# Pas d'accès aux périphériques
PrivateDevices=true
# Pas de changement d'heure
ProtectClock=true
# Pas de modification du hostname
ProtectHostname=true
# Pas de chargement de modules noyau
ProtectKernelModules=true
# Pas de modification des paramètres noyau
ProtectKernelTunables=true
# Pas d'accès réseau (pour les tâches locales)
# PrivateNetwork=true
# Pas de nouveaux privilèges (suid)
NoNewPrivileges=true
Fenêtre de terminal
# Auditer le niveau de sécurité d'un service
systemd-analyze security mon-app.service

Cette commande attribue un score de 0 à 10 (plus bas = plus sécurisé) et liste les protections manquantes.

Fenêtre de terminal
# Voir les services les plus lents au boot
systemd-analyze blame
3.456s NetworkManager-wait-online.service
1.234s docker.service
0.987s systemd-journal-flush.service
0.654s nginx.service
Fenêtre de terminal
# Graphe SVG du démarrage
systemd-analyze plot > boot.svg
SymptômeCause probableSolution
Service failed au démarrageErreur de configurationjournalctl -xeu mon-service pour lire l’erreur
Service actif mais pas enabledOubli de enablesudo systemctl enable mon-service
start échoue avec maskedService masquésudo systemctl unmask mon-service
Service redémarre en boucleStartLimitBurst atteintsystemctl reset-failed mon-service puis corriger la cause
Modification du fichier unité ignoréeCache systemdsudo systemctl daemon-reload
Permission denied dans les logsUtilisateur sans droitsVérifier User= et les permissions des fichiers
Service ne survit pas au rebootNon activé au bootsudo systemctl enable mon-service
  • systemctl gère le cycle de vie complet des services : start, stop, restart, reload, enable, disable
  • Un service enabled démarre au boot ; un service active tourne en ce moment — les deux sont indépendants
  • systemctl status et journalctl -xeu sont les outils de diagnostic essentiels
  • Un fichier unité comporte trois sections : [Unit] (dépendances), [Service] (exécution), [Install] (activation)
  • Restart=on-failure et RestartSec permettent un redémarrage automatique en cas d’échec
  • Les options de sandboxing (ProtectSystem, ProtectHome, NoNewPrivileges) durcissent un service
  • mask empêche totalement le lancement d’un service — plus strict que disable

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
5 min.
80% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn