Aller au contenu
Administration Linux medium

Dépanner un service Linux qui ne démarre pas avec systemd

11 min de lecture

Quand un service refuse de démarrer, la réponse est presque toujours dans systemctl status et journalctl -xeu. Ces deux commandes donnent l’état du service, le code de sortie et les dernières lignes de log. Dans 90 % des cas, l’erreur vient d’un fichier de configuration invalide, d’un port déjà occupé, d’une permission manquante ou d’une dépendance absente.

  • Appliquer une méthodologie de diagnostic en 5 étapes
  • Lire et interpréter la sortie de systemctl status
  • Cibler l’erreur avec journalctl -xeu
  • Corriger les 7 causes les plus fréquentes d’échec
  • Comprendre les codes de sortie de systemd
  • Relancer proprement un service après correction

Le dépannage de services est une compétence quotidienne d’administrateur :

  • Vous venez d’installer Nginx ou PostgreSQL — le service ne démarre pas au premier essai
  • Après une mise à jour de paquets, un service refuse de redémarrer à cause d’un changement de configuration
  • Un service fonctionnait hier et passe en failed ce matin sans intervention apparente
  • Vous avez modifié un fichier de configuration et le service ne redémarre plus
  • Après un reboot, plusieurs services sont en failed — il faut diagnostiquer rapidement
  1. Vérifier l’état du service

    Fenêtre de terminal
    systemctl status nginx
    ● nginx.service - A high performance web server and a reverse proxy server
    Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
    Active: failed (Result: exit-code) since Wed 2026-04-16 08:15:32 CEST; 2min ago
    Process: 1234 ExecStart=/usr/sbin/nginx (code=exited, status=1/FAILURE)
    Main PID: 1234 (code=exited, status=1/FAILURE)
    CPU: 12ms
    avr. 16 08:15:32 srv01 nginx[1234]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    avr. 16 08:15:32 srv01 systemd[1]: nginx.service: Main process exited, code=exited, status=1/FAILURE
    avr. 16 08:15:32 srv01 systemd[1]: nginx.service: Failed with result 'exit-code'.

    Les informations clés sont :

    • Active: failed — le service est en échec
    • Result: exit-code — le processus s’est terminé avec une erreur
    • status=1/FAILURE — le code de sortie
    • Les dernières lignes de log — ici, le port 80 est déjà occupé
  2. Lire les journaux détaillés

    Fenêtre de terminal
    journalctl -xeu nginx

    Le flag -x ajoute des explications, -e saute à la fin, -u filtre par unité. C’est la commande la plus utile pour comprendre un échec.

    Pour voir les logs de la dernière tentative de démarrage :

    Fenêtre de terminal
    journalctl -u nginx --since "5 min ago"
  3. Vérifier la configuration du service

    Fenêtre de terminal
    # Tester la syntaxe de la configuration
    nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful

    La plupart des services offrent une commande de test :

    ServiceCommande de test
    Nginxnginx -t
    Apacheapachectl configtest
    SSHsshd -t
    Postfixpostfix check
    Namednamed-checkconf
  4. Identifier la cause et corriger

    Corriger le fichier de configuration, libérer le port, ajuster les permissions ou installer la dépendance manquante (voir les causes courantes ci-dessous).

  5. Redémarrer et vérifier

    Fenêtre de terminal
    # Si le fichier unité a été modifié
    sudo systemctl daemon-reload
    # Redémarrer le service
    sudo systemctl restart nginx
    # Vérifier
    systemctl status nginx

Symptôme : le service s’arrête immédiatement après le démarrage.

nginx: [emerg] unknown directive "server_nam" in /etc/nginx/sites-enabled/default:3

Correction : corriger la faute et tester la syntaxe avant de relancer.

Symptôme : bind() failed (98: Address already in use).

Fenêtre de terminal
# Trouver quel processus occupe le port
sudo ss -tlnp | grep :80
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("apache2",pid=5678,fd=4))

Correction : arrêter le service concurrent ou changer le port.

Symptôme : No such file or directory dans les logs.

[emerg] open() "/var/log/nginx/access.log" failed (2: No such file or directory)

Correction :

Fenêtre de terminal
sudo mkdir -p /var/log/nginx
sudo systemctl restart nginx

Symptôme : Permission denied dans les journaux.

Fenêtre de terminal
# Vérifier le propriétaire du fichier
ls -la /etc/nginx/ssl/

Correction : ajuster les permissions ou le propriétaire des fichiers concernés.

Symptôme : error while loading shared libraries ou command not found.

Fenêtre de terminal
# Vérifier les bibliothèques manquantes
ldd /usr/sbin/nginx | grep "not found"

Correction : installer le paquet manquant.

Symptôme : Failed to parse service type ou Invalid argument.

Fenêtre de terminal
# Afficher le contenu du fichier unité
systemctl cat nginx.service

Correction : corriger le fichier unité, puis :

Fenêtre de terminal
sudo systemctl daemon-reload
sudo systemctl restart nginx

Symptôme : le service démarre trop tôt, avant que le réseau ou la base de données ne soit prête.

Fenêtre de terminal
# Vérifier les dépendances
systemctl cat monapp.service | grep -E "After|Requires|Wants"

Correction : ajouter les directives After= et Requires= dans la section [Unit] :

[Unit]
After=network.target postgresql.service
Requires=postgresql.service

La sortie systemctl status affiche un code de sortie qui aide au diagnostic :

CodeSignification
0Succès
1Erreur générique
2Mauvais usage de la commande
200Erreur de configuration du fichier unité
203Impossible d’exécuter la commande (pas trouvée, pas de permission)
206Répertoire de travail introuvable
207Erreur lors du changement de groupe
209Socket non disponible
217Erreur de namespace
Fenêtre de terminal
# Afficher le code de sortie exact
systemctl show nginx -p ExecMainStatus
Fenêtre de terminal
systemctl list-units --state=failed
ÉtatSignification
active (running)Le service tourne normalement
active (exited)Le processus s’est terminé avec succès (normal pour les services oneshot)
inactive (dead)Arrêté proprement
failedLe processus s’est terminé avec une erreur
activatingEn cours de démarrage
deactivatingEn cours d’arrêt

Après correction, si le service reste marqué failed :

Fenêtre de terminal
sudo systemctl reset-failed nginx
sudo systemctl start nginx

Pour obtenir une sortie verbose temporaire :

Fenêtre de terminal
sudo systemctl edit nginx.service

Ajouter un override :

[Service]
Environment=NGINX_DEBUG=1
Fenêtre de terminal
sudo systemctl daemon-reload
sudo systemctl restart nginx

Un service peut échouer à cause de limites système (nombre de fichiers ouverts, mémoire) :

Fenêtre de terminal
systemctl show nginx -p LimitNOFILE,LimitMEMLOCK,MemoryMax

Pour exécuter la commande ExecStart directement et voir l’erreur complète :

Fenêtre de terminal
# Récupérer la commande de lancement
systemctl cat nginx.service | grep ExecStart
# L'exécuter manuellement
sudo /usr/sbin/nginx -t
SymptômeCause probableSolution
Active: failed (Result: exit-code)Config invalide ou dépendance absentejournalctl -xeu service + corriger
Active: failed (Result: timeout)Service trop long au démarrageAugmenter TimeoutStartSec dans le fichier unité
Active: failed (Result: signal)Processus tué (SIGKILL, OOM)Vérifier dmesg | grep -i oom
code=exited, status=203/EXECBinaire introuvable ou non exécutableVérifier le chemin dans ExecStart
code=exited, status=200/CHDIRRépertoire de travail manquantVérifier WorkingDirectory
Service démarre puis s’arrêteType incorrect (forking vs simple)Vérifier Type= dans la section [Service]
Job failed — see journalctlMessage génériqueExécuter journalctl -xeu service
Fenêtre de terminal
# Script de diagnostic rapide
systemctl status "$1" # État actuel
journalctl -xeu "$1" --no-pager --lines=20 # Derniers logs
systemctl cat "$1" # Fichier unité
systemctl show "$1" -p ExecMainStatus # Code de sortie
  • Toujours commencer par systemctl status + journalctl -xeu — ces deux commandes répondent à 90 % des questions
  • Tester la configuration avant de relancernginx -t, sshd -t, apachectl configtest
  • Exécuter daemon-reload après modification d’un fichier .service
  • Ne pas ignorer les services en failedsystemctl list-units --state=failed doit être vérifié régulièrement
  • Documenter les corrections — noter la cause dans un commentaire du fichier de configuration ou un runbook
  • systemctl status donne l’état, le code de sortie et les dernières lignes de log — c’est le point de départ
  • journalctl -xeu service affiche les logs détaillés du service — c’est la commande de diagnostic principale
  • Les 3 erreurs les plus fréquentes : configuration invalide, port occupé, permission manquante
  • Après modification d’un fichier unité : daemon-reload puis restart
  • Les codes de sortie (203, 200, 206…) orientent directement vers la cause
  • systemctl reset-failed nettoie l’état failed après correction
  • systemctl list-units --state=failed donne la vue globale de tous les services en erreur

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