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 :
| Code | Signification |
|---|---|
0 | Succès |
1 | Erreur générique |
2 | Mauvais usage de la commande |
200 | Erreur de configuration du fichier unité |
203 | Impossible d’exécuter la commande (pas trouvée, pas de permission) |
206 | Répertoire de travail introuvable |
207 | Erreur lors du changement de groupe |
209 | Socket non disponible |
217 | Erreur de namespace |
# 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
À 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