systemctl vous permet de contrôler les services Linux depuis le terminal. En 5 commandes, vous saurez démarrer Nginx, l'activer au boot et comprendre pourquoi un service refuse de démarrer. Ce guide vous accompagne du premier systemctl status jusqu'à la création de vos propres services.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »Niveau : Débutant · Durée : 20 minutes · Prérequis : accès root ou sudo
À la fin de ce guide, vous saurez :
- Démarrer, arrêter et redémarrer un service
- Activer un service au boot (et comprendre la différence avec "démarrer")
- Diagnostiquer pourquoi un service ne démarre pas
- Créer un service personnalisé pour votre application
- Sécuriser un service avec les directives de hardening
TL;DR — Les 5 commandes indispensables
Section intitulée « TL;DR — Les 5 commandes indispensables »# 1. État complet d'un service (le "status" détaillé)sudo systemctl status nginx --no-pager -l
# 2. Démarrer / Arrêter / Redémarrersudo systemctl start nginxsudo systemctl stop nginxsudo systemctl restart nginx
# 3. Activer au boot (≠ démarrer maintenant !)sudo systemctl enable nginxsudo systemctl enable --now nginx # enable + start en une commande
# 4. Voir les logs d'un servicejournalctl -xeu nginx
# 5. Vérifier si un service tourne / est activé au bootsystemctl is-active nginxsystemctl is-enabled nginxGlossaire rapide (2 minutes)
Section intitulée « Glossaire rapide (2 minutes) »Avant d'aller plus loin, clarifions 5 termes qui créent 90% de la confusion :
| Terme | Définition | Commande associée |
|---|---|---|
| Unit | Objet géré par systemd (service, timer, socket, mount...) | systemctl list-units |
| Service | Type d'unité .service — un processus qui tourne | systemctl status nginx.service |
| Active | Le service tourne maintenant | systemctl is-active nginx |
| Enabled | Le service démarrera au boot | systemctl is-enabled nginx |
| Drop-in | Petit fichier override sans toucher au fichier vendor | systemctl edit nginx |
Les deux états à ne pas confondre
Section intitulée « Les deux états à ne pas confondre »systemd distingue deux notions d'état — c'est la source #1 de confusion pour les débutants :
État runtime (le service tourne-t-il maintenant ?)
| État | Signification |
|---|---|
active (running) | Le processus tourne |
active (exited) | Le service s'est exécuté et terminé (normal pour certains oneshot) |
inactive | Le service est arrêté |
failed | Le service a crashé ou n'a pas pu démarrer |
État d'activation (démarre-t-il au boot ?)
| État | Signification |
|---|---|
enabled | Démarre automatiquement au boot |
disabled | Ne démarre pas au boot |
static | Pas de section [Install] — ne peut pas être enable directement |
masked | Désactivé de force — impossible à démarrer même manuellement |
Scénario 1 : Démarrer, arrêter, redémarrer un service
Section intitulée « Scénario 1 : Démarrer, arrêter, redémarrer un service »Démarrer un service
Section intitulée « Démarrer un service »sudo systemctl start nginxVérifiez qu'il tourne :
systemctl is-active nginx# activeArrêter un service
Section intitulée « Arrêter un service »sudo systemctl stop nginxRedémarrer vs Recharger
Section intitulée « Redémarrer vs Recharger »Restart arrête puis redémarre le service (coupure de connexions) :
sudo systemctl restart nginxReload recharge la configuration sans couper les connexions (si le service le supporte) :
sudo systemctl reload nginxLa commande la plus sûre en ops
Section intitulée « La commande la plus sûre en ops »# Reload si possible, sinon restart — mais seulement si le service tourne déjàsudo systemctl try-reload-or-restart nginxCette commande ne fait rien si le service est arrêté (évite de démarrer par accident un service désactivé).
Scénario 2 : Activer un service au boot
Section intitulée « Scénario 2 : Activer un service au boot »Activer sans démarrer
Section intitulée « Activer sans démarrer »sudo systemctl enable nginxLe service démarrera au prochain boot, mais ne démarre pas maintenant.
Activer ET démarrer
Section intitulée « Activer ET démarrer »sudo systemctl enable --now nginxDésactiver
Section intitulée « Désactiver »sudo systemctl disable nginx # ne démarre plus au bootsudo systemctl disable --now nginx # désactive ET arrêteBloquer complètement un service (mask)
Section intitulée « Bloquer complètement un service (mask) »sudo systemctl mask nginx # impossible à démarrer, même manuellementsudo systemctl unmask nginx # annule le maskmask est utile pour s'assurer qu'un service dangereux ou obsolète ne puisse jamais être démarré par erreur.
Scénario 3 : Comprendre pourquoi ça ne démarre pas
Section intitulée « Scénario 3 : Comprendre pourquoi ça ne démarre pas »Quand un service refuse de démarrer, suivez ce workflow de dépannage :
-
Voir l'état complet
Fenêtre de terminal sudo systemctl status nginx --no-pager -lL'option
--no-pager -lévite la troncature et affiche tout. -
Consulter les logs avec contexte
Fenêtre de terminal journalctl -xeu nginx-x: ajoute des explications-e: va à la fin des logs-u nginx: filtre sur l'unité nginx
-
Voir le fichier unit et ses overrides
Fenêtre de terminal systemctl cat nginxCette commande affiche le fichier complet avec les drop-ins appliqués.
-
Inspecter les propriétés clés
Fenêtre de terminal systemctl show nginx -p ExecStart -p FragmentPath -p DropInPathsVous verrez exactement quel fichier est utilisé et quelle commande est exécutée.
Filtrer les logs par période
Section intitulée « Filtrer les logs par période »# Logs du boot actueljournalctl -u nginx -b
# Logs des dernières 30 minutesjournalctl -u nginx --since "30 min ago"
# Logs entre deux timestampsjournalctl -u nginx --since "2026-01-29 10:00" --until "2026-01-29 11:00"
# Uniquement les erreursjournalctl -u nginx -p errScénario 4 : Créer un service personnalisé
Section intitulée « Scénario 4 : Créer un service personnalisé »Vous avez un script Python ou une application que vous voulez lancer au boot ? Créez un fichier .service.
Exemple : service pour une app Python
Section intitulée « Exemple : service pour une app Python »-
Créer le fichier unit
Fenêtre de terminal sudo systemctl edit --full --force mon-app.serviceOu créez directement dans
/etc/systemd/system/mon-app.service:[Unit]Description=Mon application PythonAfter=network.target[Service]Type=simpleUser=www-dataGroup=www-dataWorkingDirectory=/opt/mon-appExecStart=/opt/mon-app/venv/bin/python app.pyRestart=on-failureRestartSec=5s[Install]WantedBy=multi-user.target -
Recharger la configuration systemd
Fenêtre de terminal sudo systemctl daemon-reloadObligatoire après toute modification de fichier unit.
-
Activer et démarrer
Fenêtre de terminal sudo systemctl enable --now mon-app -
Vérifier
Fenêtre de terminal systemctl status mon-appjournalctl -u mon-app -f # suivre les logs en temps réel
Les directives essentielles
Section intitulée « Les directives essentielles »| Directive | Section | Description |
|---|---|---|
Description= | [Unit] | Description lisible du service |
After= | [Unit] | Démarrer après ces unités |
Requires= | [Unit] | Dépendance forte (si l'autre échoue, celui-ci aussi) |
Wants= | [Unit] | Dépendance faible (on essaie de démarrer l'autre) |
Type= | [Service] | simple, forking, oneshot, notify |
ExecStart= | [Service] | Commande de démarrage |
ExecReload= | [Service] | Commande de reload (optionnel) |
Restart= | [Service] | no, on-failure, always |
RestartSec= | [Service] | Délai avant restart |
User= / Group= | [Service] | Utilisateur d'exécution |
WantedBy= | [Install] | Target qui "tire" ce service |
Modifier un service existant (sans toucher au vendor)
Section intitulée « Modifier un service existant (sans toucher au vendor) »Ne modifiez jamais les fichiers dans /usr/lib/systemd/system/ — ils seront écrasés à la prochaine mise à jour du paquet.
Utilisez plutôt les drop-ins :
sudo systemctl edit nginxCela crée /etc/systemd/system/nginx.service.d/override.conf. Ajoutez uniquement ce que vous voulez changer :
[Service]# Augmenter le nombre de fichiers ouvertsLimitNOFILE=65535Puis rechargez :
sudo systemctl daemon-reloadsudo systemctl restart nginxOù sont les fichiers unit ?
Section intitulée « Où sont les fichiers unit ? »Les chemins varient selon les distributions (Debian vs RHEL vs Arch), mais la règle d'or est de ne pas apprendre par chemin :
# Voir le chemin exact d'une unitésystemctl cat nginx | head -1
# Ou avec showsystemctl show nginx -p FragmentPath| Emplacement | Usage |
|---|---|
/usr/lib/systemd/system/ | Units fournies par les paquets (ne pas modifier) |
/lib/systemd/system/ | Idem (lié à /usr/lib sur certaines distros) |
/etc/systemd/system/ | Vos units personnalisées et overrides |
/run/systemd/system/ | Units runtime (temporaires) |
Priorité : /etc/ > /run/ > /usr/lib/
Timers : remplacer cron par systemd
Section intitulée « Timers : remplacer cron par systemd »Les timers (.timer) sont l'alternative moderne à cron. Avantages : logs centralisés, dépendances, pas de chevauchement.
Exemple : nettoyage quotidien
Section intitulée « Exemple : nettoyage quotidien »Créez /etc/systemd/system/cleanup.service :
[Unit]Description=Nettoyage des fichiers temporaires
[Service]Type=oneshotExecStart=/usr/local/bin/cleanup.shPuis /etc/systemd/system/cleanup.timer :
[Unit]Description=Lance le nettoyage tous les jours à 3h
[Timer]OnCalendar=*-*-* 03:00:00Persistent=true
[Install]WantedBy=timers.targetActivez le timer (pas le service) :
sudo systemctl enable --now cleanup.timerVérifiez les timers actifs :
systemctl list-timersSécurité : durcir un service
Section intitulée « Sécurité : durcir un service »systemd offre des directives de sandboxing puissantes. Voici un exemple de service durci :
[Service]# Utilisateur non-rootUser=mon-appDynamicUser=yes
# Isolation filesystemProtectSystem=strictProtectHome=yesPrivateTmp=yesReadWritePaths=/var/lib/mon-app
# Isolation réseau et capabilitiesNoNewPrivileges=yesCapabilityBoundingSet=RestrictAddressFamilies=AF_INET AF_INET6
# Restrictions systèmeProtectKernelModules=yesProtectKernelTunables=yesProtectControlGroups=yesMesurer la sécurité d'un service
Section intitulée « Mesurer la sécurité d'un service »systemd-analyze security nginxCette commande donne un score de 0 à 10 (10 = le plus exposé) et suggère des améliorations :
→ Overall exposure level for nginx.service: 9.2 UNSAFE 😨
NAME DESCRIPTION EXPOSURE✓ PrivateNetwork= Service has access to the host's network 0.5✗ User=/DynamicUser= Service runs as root 0.4✗ CapabilityBoundingSet=~CAP_... Service has dangerous capabilities 0.3...Appliquez les recommandations une par une et re-testez.
Recettes du quotidien
Section intitulée « Recettes du quotidien »Ces commandes couvrent l'essentiel de l'administration quotidienne d'un service. Gardez-les sous la main : elles répondent à 90 % des besoins courants.
État complet d'un service
Section intitulée « État complet d'un service »Voir si le service tourne, ses logs récents et son PID en un coup d'œil.
sudo systemctl status SERVICE --no-pager -l# Exemplesudo systemctl status nginx --no-pager -lSERVICE est le nom du service, avec ou sans le suffixe .service.
Activer ET démarrer
Section intitulée « Activer ET démarrer »Activer au boot et démarrer immédiatement, en une seule commande.
sudo systemctl enable --now SERVICE# Exemplesudo systemctl enable --now nginxReload ou restart robuste
Section intitulée « Reload ou restart robuste »Recharger la configuration si le service le supporte, sinon le redémarrer.
sudo systemctl reload-or-restart SERVICE# Exemplesudo systemctl reload-or-restart nginxVoir le fichier unit complet
Section intitulée « Voir le fichier unit complet »Afficher le fichier unit avec tous les drop-ins appliqués — la vraie configuration effective.
systemctl cat SERVICE# Exemplesystemctl cat nginxOverride propre via drop-in
Section intitulée « Override propre via drop-in »Modifier un service sans toucher au fichier vendor, qui serait écrasé à la prochaine mise à jour.
sudo systemctl edit SERVICE# Exemplesudo systemctl edit nginxLogs d'un service
Section intitulée « Logs d'un service »Voir les logs avec contexte et explications, pour comprendre un échec.
journalctl -xeu SERVICE# Exemplejournalctl -xeu nginxSuivre les logs en temps réel
Section intitulée « Suivre les logs en temps réel »L'équivalent de tail -f pour les logs systemd.
journalctl -u SERVICE -f# Exemplejournalctl -u nginx -fLister les services en échec
Section intitulée « Lister les services en échec »Repérer immédiatement ce qui ne va pas sur le système.
systemctl list-units --failedRecharger la configuration systemd
Section intitulée « Recharger la configuration systemd »Obligatoire après toute modification d'un fichier unit.
sudo systemctl daemon-reloadAuditer la sécurité d'un service
Section intitulée « Auditer la sécurité d'un service »Obtenir un score de sécurité et des recommandations concrètes.
systemd-analyze security SERVICE# Exemplesystemd-analyze security nginxServices les plus lents au boot
Section intitulée « Services les plus lents au boot »Identifier les services qui ralentissent le démarrage du système.
systemd-analyze blame | head -10Bloquer un service
Section intitulée « Bloquer un service »Empêcher un service de démarrer, même manuellement.
sudo systemctl mask SERVICE# Exemplesudo systemctl mask cupsPour débloquer ensuite : sudo systemctl unmask SERVICE.
Pièges courants
Section intitulée « Pièges courants »Ces erreurs reviennent constamment chez les débutants comme chez les opérateurs pressés. Les connaître évite des services qui « ne démarrent pas » sans raison apparente.
Confondre enable et start
Section intitulée « Confondre enable et start »sudo systemctl enable nginxSymptôme : le service n'est toujours pas démarré après la commande.
Cause : enable configure le démarrage au boot, mais ne démarre rien maintenant.
sudo systemctl enable --now nginxOublier daemon-reload
Section intitulée « Oublier daemon-reload »Vous modifiez /etc/systemd/system/mon-app.service puis lancez directement un restart.
Symptôme : les modifications ne sont pas prises en compte.
Cause : systemd garde la configuration en cache — il faut explicitement la recharger.
sudo systemctl daemon-reload && sudo systemctl restart mon-appModifier le fichier vendor
Section intitulée « Modifier le fichier vendor »sudo vim /usr/lib/systemd/system/nginx.serviceSymptôme : les modifications disparaissent à la prochaine mise à jour du paquet.
Cause : les fichiers vendor sont écrasés par les mises à jour. Il faut passer par un drop-in.
sudo systemctl edit nginxReload sur un service qui ne le supporte pas
Section intitulée « Reload sur un service qui ne le supporte pas »sudo systemctl reload mon-appSymptôme : erreur Job failed, ou service qui n'applique pas la nouvelle configuration.
Cause : tous les services ne réagissent pas au signal de reload.
sudo systemctl reload-or-restart mon-appWorkingDirectory inexistant
Section intitulée « WorkingDirectory inexistant »WorkingDirectory=/opt/mon-appSymptôme : service en failed avec No such file or directory.
Cause : le dossier n'existe pas, ou n'est pas accessible par l'utilisateur d'exécution. Vérifiez que le dossier existe et porte les bonnes permissions avant de démarrer le service.
Chemin relatif dans ExecStart
Section intitulée « Chemin relatif dans ExecStart »ExecStart=./app.pySymptôme : service en failed avec Executable path is not absolute.
Cause : systemd exige des chemins absolus dans ExecStart.
ExecStart=/opt/mon-app/venv/bin/python /opt/mon-app/app.pyPas de section [Install]
Section intitulée « Pas de section [Install] »Vous créez un service sans directive WantedBy=.
Symptôme : systemctl enable retourne static — l'activation ne fait rien.
Cause : sans section [Install], systemd ne sait pas à quel moment du boot accrocher le service. Ajoutez une section [Install] avec WantedBy=multi-user.target.
Au-delà des services : les autres types d'unités
Section intitulée « Au-delà des services : les autres types d'unités »systemd gère bien plus que des services. Voici les types d'unités les plus utiles :
| Type | Extension | Usage |
|---|---|---|
| Service | .service | Processus en arrière-plan |
| Timer | .timer | Tâches planifiées (remplace cron) |
| Socket | .socket | Activation à la demande (le service démarre quand quelqu'un se connecte) |
| Mount | .mount | Points de montage |
| Target | .target | Groupes d'unités (comme multi-user.target) |
| Path | .path | Surveillance de fichiers/dossiers |
Lister toutes les unités d'un type :
systemctl list-units --type=timersystemctl list-units --type=socketPerformance boot
Section intitulée « Performance boot »Analyser le temps de démarrage :
# Temps totalsystemd-analyze
# Services les plus lentssystemd-analyze blame | head -15
# Graphe des dépendancessystemd-analyze plot > boot.svgCe qu'il faut retenir
Section intitulée « Ce qu'il faut retenir »enable ≠ start : enable configure le boot, start démarre maintenant. Utilisez enable --now pour les deux.
Ne modifiez jamais /usr/lib/ : utilisez systemctl edit pour créer des drop-ins propres.
daemon-reload obligatoire : après toute modification de fichier unit.
reload-or-restart : la commande robuste qui marche toujours.
Workflow de debug : status --no-pager -l → journalctl -xeu → systemctl cat → systemctl show.
Sécurité mesurable : systemd-analyze security donne un score et des recommandations.
Prochaines étapes
Section intitulée « Prochaines étapes »Ressources officielles
Section intitulée « Ressources officielles »- systemd.io — documentation officielle
- Manpage systemctl — référence complète
- Manpage systemd.service — directives de fichier unit
- Manpage systemd-analyze — analyse et sécurité