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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »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
Méthodologie de diagnostic en 5 étapes
Section intitulée « Méthodologie de diagnostic en 5 étapes »-
Vérifier l'état du service
Fenêtre de terminal systemctl status nginx● nginx.service - A high performance web server and a reverse proxy serverLoaded: 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 agoProcess: 1234 ExecStart=/usr/sbin/nginx (code=exited, status=1/FAILURE)Main PID: 1234 (code=exited, status=1/FAILURE)CPU: 12msavr. 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/FAILUREavr. 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é
-
Lire les journaux détaillés
Fenêtre de terminal journalctl -xeu nginxLe flag
-xajoute des explications,-esaute à la fin,-ufiltre 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" -
Vérifier la configuration du service
Fenêtre de terminal # Tester la syntaxe de la configurationnginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successfulLa plupart des services offrent une commande de test :
Service Commande de test Nginx nginx -tApache apachectl configtestSSH sshd -tPostfix postfix checkNamed named-checkconf -
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).
-
Redémarrer et vérifier
Fenêtre de terminal # Si le fichier unité a été modifiésudo systemctl daemon-reload# Redémarrer le servicesudo systemctl restart nginx# Vérifiersystemctl status nginx
Les 7 causes d'échec les plus fréquentes
Section intitulée « Les 7 causes d'échec les plus fréquentes »1. Erreur de syntaxe dans la configuration
Section intitulée « 1. Erreur de syntaxe dans la configuration »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:3Correction : corriger la faute et tester la syntaxe avant de relancer.
2. Port déjà utilisé
Section intitulée « 2. Port déjà utilisé »Symptôme : bind() failed (98: Address already in use).
# Trouver quel processus occupe le portsudo ss -tlnp | grep :80LISTEN 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.
3. Fichier ou répertoire manquant
Section intitulée « 3. Fichier ou répertoire manquant »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 :
sudo mkdir -p /var/log/nginxsudo systemctl restart nginx4. Permissions insuffisantes
Section intitulée « 4. Permissions insuffisantes »Symptôme : Permission denied dans les journaux.
# Vérifier le propriétaire du fichierls -la /etc/nginx/ssl/Correction : ajuster les permissions ou le propriétaire des fichiers concernés.
5. Dépendance absente (paquet, bibliothèque)
Section intitulée « 5. Dépendance absente (paquet, bibliothèque) »Symptôme : error while loading shared libraries ou command not found.
# Vérifier les bibliothèques manquantesldd /usr/sbin/nginx | grep "not found"Correction : installer le paquet manquant.
6. Fichier unité incorrect
Section intitulée « 6. Fichier unité incorrect »Symptôme : Failed to parse service type ou Invalid argument.
# Afficher le contenu du fichier unitésystemctl cat nginx.serviceCorrection : corriger le fichier unité, puis :
sudo systemctl daemon-reloadsudo systemctl restart nginx7. Dépendance entre services (ordering)
Section intitulée « 7. Dépendance entre services (ordering) »Symptôme : le service démarre trop tôt, avant que le réseau ou la base de données ne soit prête.
# Vérifier les dépendancessystemctl cat monapp.service | grep -E "After|Requires|Wants"Correction : ajouter les directives After= et Requires= dans la section [Unit] :
[Unit]After=network.target postgresql.serviceRequires=postgresql.serviceComprendre les codes de sortie
Section intitulée « Comprendre les codes de sortie »La sortie systemctl status affiche un code de sortie qui aide au diagnostic :
Les codes inférieurs à 125 viennent du programme lui-même. À partir de 200, c'est systemd qui n'a pas réussi à préparer l'environnement d'exécution : l'erreur est alors dans l'unité, pas dans le programme. Chaque code désigne précisément la directive fautive, ce qui accélère beaucoup le diagnostic.
| Code | Nom systemd | Ce qui a échoué |
|---|---|---|
0 | Succès | |
1 | Erreur générique : le programme a échoué de lui-même | |
2 | Mauvais usage de la commande | |
200 | EXIT_CHDIR | Le WorkingDirectory= est introuvable ou inaccessible |
203 | EXIT_EXEC | Le binaire d'ExecStart= est introuvable, non exécutable, ou son interpréteur est absent |
209 | EXIT_STDOUT | Impossible de mettre en place la sortie (StandardOutput=) |
216 | EXIT_GROUP | Le Group= n'existe pas, ou le changement de groupe a échoué |
217 | EXIT_USER | Le User= n'existe pas, ou le changement d'utilisateur a échoué |
219 | EXIT_CGROUP | Le service n'a pas pu être placé dans son cgroup |
226 | EXIT_NAMESPACE | Échec d'une directive d'isolation (PrivateTmp=, ProtectSystem=…) |
Les deux codes les plus fréquents sont 203 (le chemin d'ExecStart= est faux,
ou le script n'a pas le bit d'exécution) et 217 (l'utilisateur déclaré dans
l'unité n'existe pas sur la machine).
# Afficher le code de sortie exactsystemctl show nginx -p ExecMainStatusLes états du service
Section intitulée « Les états du service »systemctl list-units --state=failed| État | Signification |
|---|---|
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 |
failed | Le processus s'est terminé avec une erreur |
activating | En cours de démarrage |
deactivating | En cours d'arrêt |
Réinitialiser l'état failed
Section intitulée « Réinitialiser l'état failed »Après correction, si le service reste marqué failed :
sudo systemctl reset-failed nginxsudo systemctl start nginxDiagnostic avancé
Section intitulée « Diagnostic avancé »Activer le mode debug d'un service
Section intitulée « Activer le mode debug d'un service »Pour obtenir une sortie verbose temporaire :
sudo systemctl edit nginx.serviceAjouter un override :
[Service]Environment=NGINX_DEBUG=1sudo systemctl daemon-reloadsudo systemctl restart nginxVérifier les limites de ressources
Section intitulée « Vérifier les limites de ressources »Un service peut échouer à cause de limites système (nombre de fichiers ouverts, mémoire) :
systemctl show nginx -p LimitNOFILE,LimitMEMLOCK,MemoryMaxTester un service manuellement
Section intitulée « Tester un service manuellement »Pour exécuter la commande ExecStart directement et voir l'erreur complète :
# Récupérer la commande de lancementsystemctl cat nginx.service | grep ExecStart
# L'exécuter manuellementsudo /usr/sbin/nginx -tDépannage rapide
Section intitulée « Dépannage rapide »| Symptôme | Cause probable | Solution |
|---|---|---|
Active: failed (Result: exit-code) | Config invalide ou dépendance absente | journalctl -xeu service + corriger |
Active: failed (Result: timeout) | Service trop long au démarrage | Augmenter TimeoutStartSec dans le fichier unité |
Active: failed (Result: signal) | Processus tué (SIGKILL, OOM) | Vérifier dmesg | grep -i oom |
code=exited, status=203/EXEC | Binaire introuvable ou non exécutable | Vérifier le chemin dans ExecStart |
code=exited, status=200/CHDIR | Répertoire de travail manquant | Vérifier WorkingDirectory |
| Service démarre puis s'arrête | Type incorrect (forking vs simple) | Vérifier Type= dans la section [Service] |
Job failed, see journalctl | Message générique | Exécuter journalctl -xeu service |
# Script de diagnostic rapidesystemctl status "$1" # État actueljournalctl -xeu "$1" --no-pager --lines=20 # Derniers logssystemctl cat "$1" # Fichier unitésystemctl show "$1" -p ExecMainStatus # Code de sortieBonnes pratiques
Section intitulée « Bonnes pratiques »- Toujours commencer par
systemctl status+journalctl -xeu, ces deux commandes répondent à 90 % des questions - Tester la configuration avant de relancer,
nginx -t,sshd -t,apachectl configtest - Exécuter
daemon-reloadaprès modification d'un fichier.service - Ne pas ignorer les services en failed,
systemctl list-units --state=faileddoit être vérifié régulièrement - Documenter les corrections, noter la cause dans un commentaire du fichier de configuration ou un runbook
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
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
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »systemctl statusdonne l'état, le code de sortie et les dernières lignes de log, c'est le point de départjournalctl -xeu serviceaffiche 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-reloadpuisrestart - Les codes de sortie (203, 200, 206…) orientent directement vers la cause
systemctl reset-failednettoie l'état failed après correctionsystemctl list-units --state=faileddonne la vue globale de tous les services en erreur