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 recettes couvrent les cas d'usage les plus fréquents. Cliquez sur un pattern pour voir la formule complète et un exemple prêt à copier.
État complet d'un service Base Voir si le service tourne, ses logs récents et son PID
sudo systemctl status nginx --no-pager -l
sudo systemctl status SERVICE --no-pager -l sudo systemctl status nginx --no-pager -l -
SERVICE— Nom du service (avec ou sans .service)
Activer ET démarrer Base Activer au boot et démarrer immédiatement en une commande
sudo systemctl enable --now nginx
sudo systemctl enable --now SERVICE sudo systemctl enable --now nginx Reload ou restart (robuste) Base Recharger la config si possible, sinon redémarrer
sudo systemctl reload-or-restart nginx
sudo systemctl reload-or-restart SERVICE sudo systemctl reload-or-restart nginx Voir le fichier unit complet Base Afficher le fichier unit avec tous les drop-ins appliqués
systemctl cat nginx
systemctl cat SERVICE systemctl cat nginx Override propre (drop-in) Base Modifier un service sans toucher au fichier vendor
sudo systemctl edit nginx
sudo systemctl edit SERVICE sudo systemctl edit nginx Logs d'un service Base Voir les logs avec contexte et explications
journalctl -xeu nginx
journalctl -xeu SERVICE journalctl -xeu nginx Suivre les logs en temps réel Base Équivalent de tail -f pour les logs systemd
journalctl -u nginx -f
journalctl -u SERVICE -f journalctl -u nginx -f Lister les services en échec Base Voir rapidement ce qui ne va pas sur le système
systemctl list-units --failed
systemctl list-units --failed systemctl list-units --failed Recharger la config systemd Base Obligatoire après modification d'un fichier unit
sudo systemctl daemon-reload
sudo systemctl daemon-reload sudo systemctl daemon-reload Auditer la sécurité d'un service Base Obtenir un score de sécurité et des recommandations
systemd-analyze security nginx
systemd-analyze security SERVICE systemd-analyze security nginx Services les plus lents au boot Base Identifier les services qui ralentissent le démarrage
systemd-analyze blame | head -10
systemd-analyze blame systemd-analyze blame | head -10 Bloquer un service Base Empêcher un service de démarrer même manuellement
sudo systemctl mask cups
sudo systemctl mask SERVICE sudo systemctl mask cups Aucune recette ne correspond à votre recherche.
Pièges courants
Section intitulée « Pièges courants »Ces erreurs courantes peuvent faire perdre du temps ou causer des dégâts. Les pièges les plus critiques sont affichés en premier.
Modifier le fichier vendor sudo vim /usr/lib/systemd/system/nginx.service
Danger
sudo vim /usr/lib/systemd/system/nginx.service
sudo systemctl edit nginx Confondre enable et start sudo systemctl enable nginx
Attention
sudo systemctl enable nginx
sudo systemctl enable --now nginx Oublier daemon-reload Modifier /etc/systemd/system/mon-app.service puis restart
Attention
Modifier /etc/systemd/system/mon-app.service puis restart
sudo systemctl daemon-reload && sudo systemctl restart mon-app Reload sur un service qui ne le supporte pas sudo systemctl reload mon-app
Attention
sudo systemctl reload mon-app
sudo systemctl reload-or-restart mon-app WorkingDirectory inexistant WorkingDirectory=/opt/mon-app dans le fichier unit
Attention
WorkingDirectory=/opt/mon-app dans le fichier unit
Chemin relatif dans ExecStart ExecStart=./app.py
Attention
ExecStart=./app.py
ExecStart=/opt/mon-app/venv/bin/python /opt/mon-app/app.py Pas de section [Install] Service sans WantedBy=multi-user.target
Info
Service sans 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é