systemctl est la commande centrale pour gérer les services sous Linux. Elle permet de démarrer, arrêter, redémarrer et activer au boot n’importe quel service géré par systemd. Associée à journalctl pour les logs, elle couvre l’essentiel de l’administration des services sur un serveur moderne.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre les états d’un service (active, inactive, failed, masked)
- Utiliser les commandes
systemctlpour contrôler le cycle de vie d’un service - Activer un service au démarrage et vérifier sa persistance
- Diagnostiquer un échec avec
systemctl statusetjournalctl - Créer une unité de service personnalisée
- Appliquer les options de sécurité systemd (sandboxing)
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »La gestion des services avec systemctl intervient quotidiennement en administration Linux :
- Installer un serveur web et s’assurer qu’il redémarre automatiquement après un reboot
- Diagnostiquer pourquoi un service de base de données ne démarre plus
- Appliquer un changement de configuration et recharger le service sans interruption
- Créer un service personnalisé pour une application métier
- Durcir un service exposé sur le réseau en limitant ses privilèges
Les états d’un service
Section intitulée « Les états d’un service »Un service systemd passe par plusieurs états au cours de son cycle de vie :
| État | Signification |
|---|---|
| active (running) | Le service tourne normalement |
| active (exited) | Le service a terminé son exécution avec succès (Type=oneshot) |
| inactive (dead) | Le service est arrêté |
| failed | Le service a échoué — consulter les logs |
| activating | Le service est en cours de démarrage |
| deactivating | Le service est en cours d’arrêt |
| masked | Le service est bloqué — impossible de le démarrer |
Enabled vs active
Section intitulée « Enabled vs active »Deux notions distinctes et complémentaires :
| Concept | Question | Commande |
|---|---|---|
| enabled | Le service démarre-t-il automatiquement au boot ? | systemctl is-enabled nginx |
| active | Le service tourne-t-il en ce moment ? | systemctl is-active nginx |
Un service peut être enabled mais inactive (il sera lancé au prochain reboot). Il peut être active mais disabled (il tourne mais ne survivra pas au reboot).
Commandes systemctl essentielles
Section intitulée « Commandes systemctl essentielles »Contrôle immédiat (runtime)
Section intitulée « Contrôle immédiat (runtime) »# Démarrer un servicesudo systemctl start nginx
# Arrêter un servicesudo systemctl stop nginx
# Redémarrer un service (arrêt + démarrage)sudo systemctl restart nginx
# Recharger la configuration sans redémarrersudo systemctl reload nginxActivation au démarrage
Section intitulée « Activation au démarrage »# Activer le démarrage automatique au bootsudo systemctl enable nginx
# Activer ET démarrer immédiatementsudo systemctl enable --now nginx
# Désactiver le démarrage automatiquesudo systemctl disable nginxVérifier l’état
Section intitulée « Vérifier l’état »systemctl status nginx● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled) Active: active (running) since Sat 2026-06-28 06:32:15 CEST; 6h ago Docs: man:nginx(8) Process: 1234 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; ... (code=exited, status=0/SUCCESS) Main PID: 1235 (nginx) Tasks: 3 (limit: 4644) Memory: 8.2M CPU: 123ms CGroup: /system.slice/nginx.service ├─1235 "nginx: master process /usr/sbin/nginx ..." └─1236 "nginx: worker process"Chaque ligne apporte une information :
| Ligne | Signification |
|---|---|
| Loaded | Chemin du fichier unité + état d’activation (enabled/disabled) |
| Active | État actuel + depuis quand |
| Main PID | PID du processus principal |
| Tasks | Nombre de tâches/threads |
| Memory | Consommation mémoire |
| CGroup | Arborescence des processus dans le cgroup |
Commandes de vérification rapide
Section intitulée « Commandes de vérification rapide »# Le service est-il actif ?systemctl is-active nginx# active
# Le service démarre-t-il au boot ?systemctl is-enabled nginx# enabled
# Le service a-t-il échoué ?systemctl is-failed nginx# active (pas d'échec)Inspecter la configuration d’un service
Section intitulée « Inspecter la configuration d’un service »# Afficher le fichier unité completsystemctl cat nginx
# Afficher des propriétés spécifiquessystemctl show nginx --property=MainPID,ActiveState,SubStateMainPID=1235ActiveState=activeSubState=runningLister les services
Section intitulée « Lister les services »# Tous les services chargéssystemctl list-units --type=service
# Uniquement les services en échecsystemctl list-units --type=service --state=failed
# Tous les services installés (y compris désactivés)systemctl list-unit-files --type=serviceMasquer un service
Section intitulée « Masquer un service »Masquer un service empêche toute tentative de démarrage — même manuelle :
# Masquer un servicesudo systemctl mask bluetooth
# Démasquersudo systemctl unmask bluetoothDiagnostiquer un service en échec
Section intitulée « Diagnostiquer un service en échec »Quand un service est en état failed, suivez cette démarche :
-
Lire le statut
Fenêtre de terminal systemctl status mon-serviceLes dernières lignes de log apparaissent directement.
-
Consulter les logs détaillés
Fenêtre de terminal journalctl -xeu mon-service-x: ajoute des explications contextuelles-e: saute à la fin du journal-u: filtre par unité
-
Filtrer par niveau d’erreur
Fenêtre de terminal journalctl -u mon-service -p err -b-p err: uniquement les erreurs et au-dessus-b: depuis le dernier démarrage
-
Corriger et relancer
Fenêtre de terminal # Corriger la configuration puis :sudo systemctl daemon-reload # si le fichier unité a changésudo systemctl restart mon-servicesystemctl status mon-service
Créer un service personnalisé
Section intitulée « Créer un service personnalisé »Pour exécuter une application métier comme un service systemd :
sudo systemctl edit --full --force mon-app.service[Unit]Description=Mon application métierAfter=network.target postgresql.serviceWants=postgresql.service
[Service]Type=simpleUser=appuserGroup=appuserWorkingDirectory=/opt/mon-appExecStart=/opt/mon-app/bin/start.shExecReload=/bin/kill -HUP $MAINPIDRestart=on-failureRestartSec=5s
[Install]WantedBy=multi-user.targetLes sections d’un fichier unité
Section intitulée « Les sections d’un fichier unité »| Section | Rôle |
|---|---|
| [Unit] | Description, dépendances, ordre de démarrage |
| [Service] | Type, commandes, utilisateur, redémarrage |
| [Install] | Quand activer le service (target) |
Types de services
Section intitulée « Types de services »| Type | Comportement |
|---|---|
simple | Le processus lancé par ExecStart est le processus principal (défaut) |
forking | Le processus se détache (fork) — systemd suit le PID fils |
oneshot | Exécute une commande puis se termine (scripts, tâches ponctuelles) |
notify | Le processus signale à systemd qu’il est prêt via sd_notify() |
idle | Attend que tous les jobs soient terminés avant de démarrer |
Directives de redémarrage
Section intitulée « Directives de redémarrage »| Directive | Valeur | Effet |
|---|---|---|
Restart | on-failure | Redémarre uniquement en cas d’échec (code retour ≠ 0) |
Restart | always | Redémarre dans tous les cas |
Restart | no | Ne redémarre jamais (défaut) |
RestartSec | 5s | Attend 5 secondes avant le redémarrage |
StartLimitBurst | 3 | Nombre max de redémarrages dans la fenêtre |
StartLimitIntervalSec | 60s | Fenêtre de temps pour les redémarrages |
Sécurité : durcir un service
Section intitulée « Sécurité : durcir un service »systemd offre des options de sandboxing pour limiter ce qu’un service peut faire :
[Service]# Système de fichiers en lecture seuleProtectSystem=strictReadWritePaths=/var/lib/mon-app /var/log/mon-app
# Répertoire /home inaccessibleProtectHome=true
# Pas d'accès aux périphériquesPrivateDevices=true
# Pas de changement d'heureProtectClock=true
# Pas de modification du hostnameProtectHostname=true
# Pas de chargement de modules noyauProtectKernelModules=true
# Pas de modification des paramètres noyauProtectKernelTunables=true
# Pas d'accès réseau (pour les tâches locales)# PrivateNetwork=true
# Pas de nouveaux privilèges (suid)NoNewPrivileges=true# Auditer le niveau de sécurité d'un servicesystemd-analyze security mon-app.serviceCette commande attribue un score de 0 à 10 (plus bas = plus sécurisé) et liste les protections manquantes.
Optimiser le temps de démarrage
Section intitulée « Optimiser le temps de démarrage »# Voir les services les plus lents au bootsystemd-analyze blame3.456s NetworkManager-wait-online.service1.234s docker.service0.987s systemd-journal-flush.service0.654s nginx.service# Graphe SVG du démarragesystemd-analyze plot > boot.svgDépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
| Service failed au démarrage | Erreur de configuration | journalctl -xeu mon-service pour lire l’erreur |
| Service actif mais pas enabled | Oubli de enable | sudo systemctl enable mon-service |
start échoue avec masked | Service masqué | sudo systemctl unmask mon-service |
| Service redémarre en boucle | StartLimitBurst atteint | systemctl reset-failed mon-service puis corriger la cause |
| Modification du fichier unité ignorée | Cache systemd | sudo systemctl daemon-reload |
| Permission denied dans les logs | Utilisateur sans droits | Vérifier User= et les permissions des fichiers |
| Service ne survit pas au reboot | Non activé au boot | sudo systemctl enable mon-service |
À retenir
Section intitulée « À retenir »- systemctl gère le cycle de vie complet des services :
start,stop,restart,reload,enable,disable - Un service enabled démarre au boot ; un service active tourne en ce moment — les deux sont indépendants
- systemctl status et journalctl -xeu sont les outils de diagnostic essentiels
- Un fichier unité comporte trois sections :
[Unit](dépendances),[Service](exécution),[Install](activation) Restart=on-failureetRestartSecpermettent un redémarrage automatique en cas d’échec- Les options de sandboxing (
ProtectSystem,ProtectHome,NoNewPrivileges) durcissent un service maskempêche totalement le lancement d’un service — plus strict quedisable
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
Prochaines étapes
Section intitulée « Prochaines étapes »Questions fréquentes
Section intitulée « Questions fréquentes »Pourquoi systemd ?
| Aspect | SysVinit (ancien) | systemd (moderne) |
|---|---|---|
| Démarrage | Séquentiel (lent) | Parallèle (rapide) |
| Dépendances | Scripts manuels | Automatiques |
| Journalisation | Fichiers dispersés | Centralisée (journalctl) |
| Surveillance | Cron/scripts | Intégrée (watchdog) |
| Isolation | Limitée | cgroups, namespaces |
Composants principaux
- systemctl : gestion des services
- journalctl : consultation des logs
- systemd-analyze : analyse du démarrage
- Unités : services, timers, sockets, targets...
Vérifier si systemd est actif
# Vérifier le PID 1
ps -p 1 -o comm=
# Doit afficher : systemd
# Version
systemctl --version
Gestion d'un service
# Démarrer un service
sudo systemctl start nginx.service
# Arrêter un service
sudo systemctl stop nginx.service
# Redémarrer (arrêt + démarrage)
sudo systemctl restart nginx.service
# Recharger la configuration (sans arrêt)
sudo systemctl reload nginx.service
# Vérifier l'état
systemctl status nginx.service
Démarrage automatique
# Activer au boot
sudo systemctl enable nginx.service
# Désactiver au boot
sudo systemctl disable nginx.service
# Activer ET démarrer immédiatement
sudo systemctl enable --now nginx.service
Lister et rechercher
# Lister tous les services
systemctl list-units --type=service
# Services actifs uniquement
systemctl list-units --type=service --state=active
# Services en échec
systemctl list-units --type=service --state=failed
# Rechercher un service
systemctl list-unit-files | grep docker
Après modification d'un fichier .service
sudo systemctl daemon-reload
sudo systemctl restart mon-service.service
.service dans /etc/systemd/system/.Étape 1 : Créer le fichier de service
sudo nano /etc/systemd/system/mon-app.service
Étape 2 : Structure du fichier
[Unit]
Description=Mon Application Python
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/mon-app
ExecStart=/opt/mon-app/venv/bin/python app.py
Restart=on-failure
RestartSec=5
# Sécurité
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Étape 3 : Activer et démarrer
# Recharger la configuration
sudo systemctl daemon-reload
# Activer au démarrage
sudo systemctl enable mon-app.service
# Démarrer
sudo systemctl start mon-app.service
# Vérifier
systemctl status mon-app.service
Sections expliquées
| Section | Rôle |
|---|---|
| [Unit] | Métadonnées, description, dépendances |
| [Service] | Comment exécuter le service |
| [Install] | Quand démarrer (target) |
Comparaison
| Commande | Action | Effet immédiat | Au reboot |
|---|---|---|---|
start |
Démarre le service | ✅ Oui | ❌ Non |
stop |
Arrête le service | ✅ Oui | ❌ Non |
restart |
Arrête puis redémarre | ✅ Oui | ❌ Non |
reload |
Recharge la config | ✅ Oui (sans interruption) | ❌ Non |
enable |
Active au boot | ❌ Non | ✅ Oui |
disable |
Désactive au boot | ❌ Non | ✅ Oui |
Cas d'usage
# Je veux démarrer un service maintenant
sudo systemctl start nginx
# Je veux qu'il démarre automatiquement au boot
sudo systemctl enable nginx
# Je veux les deux en même temps
sudo systemctl enable --now nginx
# J'ai modifié la config de nginx, je veux recharger sans couper le service
sudo systemctl reload nginx
# Le service est planté, je veux le relancer
sudo systemctl restart nginx
Attention
reload ne fonctionne que si le service le supporte (Nginx, Apache, Postfix...). Sinon, utilisez restart.Étape 1 : Vérifier l'état
systemctl status mon-service.service
Cherchez :Active: failed(rouge)- Le code de sortie (
status=1/FAILURE) - Les dernières lignes de log
Étape 2 : Consulter les logs complets
# Logs du service
journalctl -u mon-service.service
# Logs récents uniquement
journalctl -u mon-service.service -n 50
# Suivre en temps réel
journalctl -u mon-service.service -f
# Uniquement les erreurs
journalctl -u mon-service.service -p err
Étape 3 : Vérifier la syntaxe du fichier service
sudo systemd-analyze verify /etc/systemd/system/mon-service.service
Étape 4 : Tester manuellement
# Exécuter la commande ExecStart à la main
sudo -u www-data /opt/mon-app/venv/bin/python app.py
Erreurs fréquentes
| Symptôme | Cause probable |
|---|---|
code=exited, status=203/EXEC |
Chemin ExecStart invalide |
code=exited, status=217/USER |
Utilisateur inexistant |
code=exited, status=200/CHDIR |
WorkingDirectory inexistant |
code=killed, signal=KILL |
OOM Killer (mémoire) |
Commandes essentielles
# Logs d'un service spécifique
journalctl -u nginx.service
# Les 100 dernières lignes
journalctl -u nginx.service -n 100
# Suivre en temps réel (comme tail -f)
journalctl -u nginx.service -f
# Depuis le dernier boot
journalctl -u nginx.service -b
# Depuis une date
journalctl -u nginx.service --since "2026-01-08 10:00"
# Entre deux dates
journalctl -u nginx.service --since yesterday --until today
Filtrer par niveau de gravité
# Erreurs uniquement
journalctl -u nginx.service -p err
# Erreurs et warnings
journalctl -u nginx.service -p warning
# Niveaux : emerg, alert, crit, err, warning, notice, info, debug
Format de sortie
# Format JSON (pour parsing)
journalctl -u nginx.service -o json
# Format court (une ligne par entrée)
journalctl -u nginx.service -o short
# Avec horodatage précis
journalctl -u nginx.service -o short-precise
Gestion de l'espace disque
# Taille des logs
journalctl --disk-usage
# Nettoyer (garder 7 jours)
sudo journalctl --vacuum-time=7d
# Nettoyer (garder 500 Mo max)
sudo journalctl --vacuum-size=500M
Targets courants
| Target | Équivalent | Description |
|---|---|---|
poweroff.target |
runlevel 0 | Arrêt du système |
rescue.target |
runlevel 1 | Mode maintenance (mono-utilisateur) |
multi-user.target |
runlevel 3 | Mode multi-utilisateur (sans GUI) |
graphical.target |
runlevel 5 | Mode graphique (avec GUI) |
reboot.target |
runlevel 6 | Redémarrage |
Commandes
# Voir le target actuel
systemctl get-default
# Changer le target par défaut (serveur sans GUI)
sudo systemctl set-default multi-user.target
# Changer le target par défaut (desktop avec GUI)
sudo systemctl set-default graphical.target
# Basculer immédiatement vers un target
sudo systemctl isolate rescue.target
Dans un fichier .service
[Install]
WantedBy=multi-user.target
Signifie : "Ce service sera démarré quand le système atteint le mode multi-utilisateur."mask) est plus strict que le désactiver (disable).Différence mask vs disable
| Action | Effet |
|---|---|
disable |
Le service ne démarre pas automatiquement au boot, mais peut être démarré manuellement |
mask |
Le service est complètement bloqué, impossible de le démarrer même manuellement |
Commandes
# Masquer un service
sudo systemctl mask dangerous-service.service
# Vérifier (affiche "masked")
systemctl status dangerous-service.service
# Essayer de démarrer (échouera)
sudo systemctl start dangerous-service.service
# Erreur: Unit dangerous-service.service is masked.
# Démasquer
sudo systemctl unmask dangerous-service.service
Cas d'usage
- Empêcher un service vulnérable de démarrer accidentellement
- Désactiver des services par défaut non souhaités (cups, avahi...)
- Conflits entre services incompatibles
Comment ça marche
mask crée un lien symbolique vers /dev/null, rendant le service inutilisable.Dans le fichier .service
[Service]
# Limite mémoire (max 512 Mo)
MemoryMax=512M
MemoryHigh=400M # Throttling au-delà
# Limite CPU (50% d'un cœur)
CPUQuota=50%
# Nombre de processus max
TasksMax=100
# Priorité I/O (entre 100 et 10000)
IOWeight=200
Appliquer temporairement (sans modifier le fichier)
# Limiter la mémoire à 256 Mo
sudo systemctl set-property mon-service.service MemoryMax=256M
# Limiter le CPU à 25%
sudo systemctl set-property mon-service.service CPUQuota=25%
Vérifier les limites actuelles
systemctl show mon-service.service | grep -E 'Memory|CPU|Tasks'
Exemple complet (service gourmand)
[Service]
ExecStart=/opt/app/run.sh
# Limites strictes
MemoryMax=1G
MemoryHigh=800M
CPUQuota=200% # 2 cœurs max
TasksMax=50
# Tuer si dépassement mémoire
OOMPolicy=kill
Options de sécurité recommandées
[Service]
# Exécuter en tant qu'utilisateur non-root
User=www-data
Group=www-data
# Empêcher l'élévation de privilèges
NoNewPrivileges=true
# Système de fichiers en lecture seule
ProtectSystem=strict
ProtectHome=true
# Répertoire /tmp privé
PrivateTmp=true
# Masquer /proc et /sys
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
# Filtrer les appels système
SystemCallFilter=@system-service
SystemCallArchitectures=native
# Réseau restreint (si pas besoin)
PrivateNetwork=true
# Capabilities limitées
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
Analyser la sécurité d'un service
# Score de sécurité (0-10, plus bas = mieux)
systemd-analyze security mon-service.service
Exemple minimal sécurisé
[Unit]
Description=API Sécurisée
After=network.target
[Service]
Type=simple
User=api-user
ExecStart=/opt/api/run
Restart=on-failure
# Durcissement
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/api
[Install]
WantedBy=multi-user.target
Temps total de démarrage
systemd-analyze
# Startup finished in 3.5s (kernel) + 12.4s (userspace) = 15.9s
Services les plus lents
systemd-analyze blame
# 8.123s apt-daily-upgrade.service
# 4.567s docker.service
# 2.345s NetworkManager-wait-online.service
# ...
Graphique de démarrage (SVG)
systemd-analyze plot > boot.svg
firefox boot.svg # Visualiser
Chaîne critique (dépendances)
systemd-analyze critical-chain
# graphical.target @15.9s
# └─multi-user.target @15.9s
# └─docker.service @11.3s +4.5s
# └─network.target @11.2s
Optimisations courantes
| Service lent | Solution |
|---|---|
apt-daily-upgrade.service |
Décaler avec timer |
NetworkManager-wait-online |
Désactiver si IP statique |
docker.service |
Démarrer à la demande (socket) |
snapd.service |
Désactiver si non utilisé |
Configuration dans le fichier .service
[Service]
ExecStart=/opt/app/run
# Redémarrer en cas d'échec
Restart=on-failure
# Délai entre les redémarrages (éviter boucle infinie)
RestartSec=5
# Nombre max de redémarrages par intervalle
StartLimitBurst=5
StartLimitIntervalSec=60
# → Max 5 redémarrages par minute, sinon abandon
Options de Restart
| Valeur | Redémarre si... |
|---|---|
no |
Jamais (défaut) |
on-success |
Code de sortie = 0 |
on-failure |
Code ≠ 0, signal, timeout |
on-abnormal |
Signal, timeout, watchdog |
on-abort |
Signal non-catchable (SIGKILL) |
always |
Toujours (sauf systemctl stop) |
Exemple robuste
[Service]
ExecStart=/opt/api/server
Restart=always
RestartSec=10
# Attendre 30s avant de considérer le service comme "démarré"
# (évite les redémarrages si crash immédiat)
StartLimitBurst=3
StartLimitIntervalSec=300
# Watchdog : tuer si pas de réponse en 30s
WatchdogSec=30
Vérifier le comportement
# Tuer le processus pour tester le redémarrage
sudo kill -9 $(pgrep -f mon-app)
systemctl status mon-app.service
Créer un timer
1. Le service (ce qui sera exécuté)# /etc/systemd/system/backup.service
[Unit]
Description=Backup quotidien
[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
User=backup
2. Le timer (quand exécuter)# /etc/systemd/system/backup.timer
[Unit]
Description=Timer pour backup quotidien
[Timer]
# Tous les jours à 3h du matin
OnCalendar=*-*-* 03:00:00
# Rattraper si le système était éteint
Persistent=true
# Ajouter un délai aléatoire (évite surcharge simultanée)
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
Activer le timer
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
Syntaxe OnCalendar
# Tous les jours à minuit
OnCalendar=daily
# Toutes les heures
OnCalendar=hourly
# Tous les lundis à 8h
OnCalendar=Mon *-*-* 08:00:00
# Toutes les 15 minutes
OnCalendar=*:0/15
Lister les timers actifs
systemctl list-timers
Types principaux
| Type | Comportement | Exemple |
|---|---|---|
simple |
Le processus ExecStart est le service | Scripts, apps Node.js |
forking |
Le processus se fork, le parent quitte | Apache, Nginx traditionnel |
oneshot |
Exécute une fois et termine | Scripts de maintenance |
notify |
Le service signale quand il est prêt | systemd-notify, Docker |
dbus |
Prêt quand nom D-Bus acquis | Services desktop |
idle |
Attend que les jobs soient finis | Login prompts |
Exemples
simple (défaut, le plus courant) :[Service]
Type=simple
ExecStart=/usr/bin/node /opt/app/server.js
forking (daemons traditionnels) :[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -HUP $MAINPID
oneshot (scripts ponctuels) :[Service]
Type=oneshot
ExecStart=/opt/scripts/cleanup.sh
RemainAfterExit=yes # Garder l'état "active"
notify (signal de disponibilité) :[Service]
Type=notify
ExecStart=/usr/bin/docker daemon
[Unit].Directives principales
| Directive | Signification |
|---|---|
After= |
Démarrer après ce service (ordre) |
Before= |
Démarrer avant ce service |
Requires= |
Dépendance forte (si l'autre plante, celui-ci aussi) |
Wants= |
Dépendance souple (si l'autre plante, continue) |
BindsTo= |
Dépendance très forte (arrêt synchronisé) |
Conflicts= |
Ne peut pas tourner en même temps |
Exemples
API qui a besoin de la base de données :[Unit]
Description=Mon API
After=network.target postgresql.service
Requires=postgresql.service
# Si PostgreSQL plante, l'API est arrêtée aussi
Service optionnel (Redis comme cache) :[Unit]
Description=Mon API avec cache optionnel
After=network.target redis.service
Wants=redis.service
# Si Redis n'est pas là, l'API démarre quand même
Services incompatibles :[Unit]
Description=Apache
Conflicts=nginx.service
# Apache et Nginx ne peuvent pas tourner ensemble
Visualiser les dépendances
# Dépendances d'un service
systemctl list-dependencies nginx.service
# Dépendances inversées (qui dépend de...)
systemctl list-dependencies --reverse network.target