systemd : ce que c'est, son fonctionnement et la gestion des services sous Linux
systemd est le système d'initialisation et le gestionnaire de services de Linux : le noyau le lance comme premier processus (PID 1), il démarre les autres services dans le bon ordre et les surveille. Tout ce que gère systemd est décrit par des unités — des descriptions en texte de services, de minuteurs et de points de montage ; systemctl les démarre, les arrête et les active au démarrage, et journalctl affiche leurs journaux.
systemd est le système d'initialisation et le gestionnaire de services utilisé par la plupart des distributions Linux modernes : Debian, Ubuntu, Fedora, RHEL et leurs dérivés. Après le démarrage, le noyau lance systemd comme premier processus, de PID 1, puis celui-ci met en route le réseau, monte les disques, démarre le serveur web, la base de données et tout le reste. En résumé, systemd est le « répartiteur » qui sait quels services doivent tourner, dans quel ordre les démarrer et quoi faire lorsqu'un service tombe.
Pour vérifier que vous utilisez systemd, il suffit de lancer :
$ ps -p 1 -o comm=
systemd
Pourquoi systemd a été créé
Auparavant, Linux utilisait SysV init : un ensemble de scripts shell dans /etc/init.d/, exécutés les uns après les autres. Ce schéma était compréhensible, mais lent et fragile. Chaque script écrivait son propre fichier PID, décidait seul de la manière de vérifier qu'un processus était vivant, et il fallait ajouter séparément le redémarrage d'un service tombé.
systemd résout ces problèmes de façon centralisée :
- Démarrage parallèle. Les services démarrent simultanément lorsqu'il n'existe pas de dépendance entre eux, ce qui accélère le démarrage.
- Dépendances et ordre. La description du service indique explicitement ce dont il a besoin (par exemple le réseau) et après quoi le lancer.
- Supervision. systemd connaît tous les processus d'un service grâce aux cgroups et peut le redémarrer après une panne.
- Journal unique. La sortie de tous les services est collectée par journald ; on consulte les journaux avec une seule commande.
- Interface unique. Chaque service se gère de la même façon :
systemctl start|stop|restart|status.
En plus du gestionnaire de services, le projet systemd comprend plusieurs composants : journald (journalisation), logind (sessions des utilisateurs), timesyncd (synchronisation de l'heure), resolved (DNS), networkd (réseau). Toutes les distributions n'utilisent pas l'ensemble, mais systemd en tant que PID 1 et journald sont presque partout présents.
Unités : de quoi est constitué systemd
Tout ce que gère systemd est décrit par des unités (units). Une unité est un fichier texte au format INI ; son type se déduit de l'extension.
| Type | Extension | Ce qu'elle décrit |
|---|---|---|
| service | .service | un service — un processus démon ou une tâche ponctuelle |
| timer | .timer | le lancement d'une autre unité selon un calendrier (remplacement de cron) |
| socket | .socket | un socket dont l'appel lance le service |
| target | .target | un groupe d'unités, un « état du système » (par exemple multi-user.target) |
| mount | .mount | un point de montage |
| path | .path | la surveillance d'un fichier ou d'un répertoire |
Où se trouvent les fichiers d'unités
Les fichiers d'unités sont rangés dans plusieurs répertoires, selon un ordre de priorité :
/usr/lib/systemd/system/(sous Debian et Ubuntu aussi/lib/systemd/system/) — unités installées par les paquets. On ne les modifie pas à la main : une mise à jour du paquet écraserait vos changements./etc/systemd/system/— unités et surcharges de l'administrateur. Elles ont la priorité la plus haute./run/systemd/system/— unités temporaires créées pendant le fonctionnement.
Pour voir le contenu effectif d'une unité avec toutes ses surcharges, utilisez systemctl cat nginx.service.
Des targets à la place des niveaux d'exécution
Les anciens runlevels ont été remplacés par les targets. multi-user.target est le mode serveur habituel, sans graphique ; graphical.target est le mode avec interface graphique ; rescue.target est le mode de récupération mono-utilisateur. La cible par défaut s'affiche avec systemctl get-default et se modifie avec systemctl set-default multi-user.target.
systemctl : gérer les services
systemctl est l'outil principal pour travailler avec systemd. La plupart des commandes modifient l'état du système et nécessitent sudo.
| Commande | Ce qu'elle fait |
|---|---|
systemctl status nginx | état du service, PID, mémoire, dernières lignes du journal |
systemctl start nginx | démarrer maintenant |
systemctl stop nginx | arrêter |
systemctl restart nginx | redémarrer (stop + start) |
systemctl reload nginx | relire la configuration sans arrêt (si le service le permet) |
systemctl enable nginx | ajouter au démarrage automatique |
systemctl disable nginx | retirer du démarrage automatique |
systemctl enable --now nginx | activer le démarrage automatique et lancer immédiatement |
systemctl is-active nginx | afficher active/inactive — pratique dans les scripts |
systemctl list-units --type=service | services chargés |
systemctl --failed | unités en échec |
systemctl daemon-reload | relire les fichiers d'unités après une modification |
Lire systemctl status
$ 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 Mon 2026-10-12 09:14:03 UTC; 2h 5min ago
Docs: man:nginx(8)
Main PID: 812 (nginx)
Tasks: 3 (limit: 2307)
Memory: 6.1M
CPU: 154ms
CGroup: /system.slice/nginx.service
├─812 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
├─813 "nginx: worker process"
└─814 "nginx: worker process"
La ligne Loaded indique d'où provient le fichier d'unité et si le démarrage automatique est activé (enabled). La ligne Active donne l'état courant : active (running), inactive (dead) ou failed. Le bloc CGroup liste tous les processus du service — c'est ainsi que systemd sait ce qui lui appartient.
enable ou start
C'est une confusion fréquente. start lance le service immédiatement, mais après un redémarrage il ne revient pas tout seul. enable crée un lien symbolique dans le répertoire de la target (par exemple /etc/systemd/system/multi-user.target.wants/) : le service démarre alors au boot, mais il ne tourne pas encore. En général, il faut les deux — utilisez enable --now.
Il existe aussi un troisième état, mask. systemctl mask service relie l'unité à /dev/null, et elle ne peut plus être lancée ni manuellement ni comme dépendance. C'est utile lorsqu'un service doit être coupé de façon certaine.
journalctl : les journaux des services
Tout ce qu'un service écrit sur stdout et stderr est capturé par systemd-journald et conservé dans un journal binaire avec les métadonnées : nom de l'unité, PID, priorité, heure. On lit le journal avec la commande journalctl.
journalctl -u nginx # journal d'un service
journalctl -u nginx -f # suivre en temps réel, comme tail -f
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx -n 50 # les 50 dernières lignes
journalctl -b # depuis le démarrage courant
journalctl -b -1 # le démarrage précédent
journalctl -p err -b # uniquement les erreurs et plus graves
journalctl -k # messages du noyau
journalctl --disk-usage # espace occupé par le journal
L'option -p filtre selon la priorité syslog : emerg, alert, crit, err, warning, notice, info, debug. Le niveau choisi inclut tout ce qui est plus grave que lui.
Le journal après un redémarrage
Si le répertoire /var/log/journal n'existe pas et que /etc/systemd/journald.conf contient Storage=auto, le journal n'est conservé qu'en mémoire (/run/log/journal) et disparaît au redémarrage. Pour le rendre permanent, réglez Storage=persistent ou créez le répertoire puis redémarrez journald. La taille est limitée par le paramètre SystemMaxUse=, et les anciennes entrées se suppriment avec journalctl --vacuum-time=2weeks ou --vacuum-size=500M.
journald fonctionne souvent avec rsyslog : le journal transmet les messages à rsyslog, qui écrit les fichiers texte classiques dans /var/log/ et peut envoyer les journaux vers un serveur centralisé.
Démarrage automatique de votre propre service : exemple de fichier d'unité
Supposons que vous ayez une application — un script ou un binaire — qui doit rester en marche, démarrer au boot et redémarrer en cas de panne. Créez le fichier /etc/systemd/system/myapp.service :
[Unit]
Description=Mon application web
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
EnvironmentFile=/etc/myapp/env
ExecStart=/opt/myapp/bin/server --port 8080
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Examinons les sections :
- [Unit] — description et dépendances.
After=ne fixe que l'ordre,Wants=est une dépendance souple (l'unité est tirée au démarrage, mais l'échec de sa mise en route n'empêche pas le reste). Une dépendance stricte estRequires=. - [Service] — comment le lancer.
Type=simplesignifie que le processus deExecStartest le service lui-même et ne passe pas en arrière-plan.User=le lance sous un utilisateur sans privilèges.Restart=on-failureredémarre le service s'il s'est terminé en erreur, aprèsRestartSecsecondes. - [Install] — ce que fait
enable.WantedBy=multi-user.targetsignifie « démarrer lors d'un démarrage normal ».
Application :
sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
systemctl status myapp
journalctl -u myapp -f
Erreurs fréquentes dans les fichiers d'unités
- Chemin relatif dans ExecStart. Le chemin du programme doit être absolu. systemd ne cherche pas les commandes dans le
PATHde l'utilisateur comme le fait un shell. - Oubli de daemon-reload. Après une modification du fichier, systemd continue d'utiliser l'ancienne version et le signale dans
status. - Le démon passe en arrière-plan. Si le programme se duplique lui-même alors que
Type=simpleest indiqué, systemd considère que le service s'est arrêté. Soit le programme reste au premier plan, soit vous utilisezType=forkingavecPIDFile=. - Variables d'environnement du profil. Le service ne voit ni
~/.bashrcni/etc/profile. Les variables se définissent avecEnvironment=ouEnvironmentFile=.
Modifier sans toucher à l'unité du paquet
Pour changer les paramètres d'un service installé par un paquet sans modifier son fichier, utilisez un drop-in :
sudo systemctl edit nginx
Un éditeur s'ouvre et les modifications sont enregistrées dans /etc/systemd/system/nginx.service.d/override.conf. Vous pouvez par exemple y ajouter une section [Service] avec Restart=always. Une fois l'éditeur fermé, systemd relit la configuration tout seul.
Les timers systemd à la place de cron
Un timer est une unité qui lance selon un calendrier le service du même nom. Par rapport à cron, ses avantages sont les suivants : les journaux de la tâche sont dans le journal, les dépendances sont prises en charge, et les exécutions manquées peuvent être rattrapées (Persistent=true). Exemple — une sauvegarde quotidienne :
# /etc/systemd/system/backup.service
[Unit]
Description=Sauvegarde nocturne
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# /etc/systemd/system/backup.timer
[Unit]
Description=Lancer la sauvegarde chaque jour
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers
Vous pouvez vérifier une expression OnCalendar avec systemd-analyze calendar "*-*-* 03:00:00" : la commande indique quand aura lieu la prochaine exécution.
Diagnostic de la durée de démarrage
systemd conserve l'heure de démarrage de chaque unité, ce qui permet d'analyser facilement un démarrage lent :
systemd-analyze # durée totale du démarrage
systemd-analyze blame # unités triées par durée de démarrage
systemd-analyze critical-chain # la chaîne qui a retardé le démarrage
systemd-analyze verify /etc/systemd/system/myapp.service # vérifier un fichier d'unité
Synthèse
systemd est le PID 1 et le gestionnaire de services de Linux moderne. Il décrit tout par des unités, se pilote avec systemctl, rassemble les journaux dans un journal que lit journalctl, et peut lancer des tâches avec des timers à la place de cron. Pour l'utiliser en confiance, maîtrisez status, enable --now, journalctl -u, et sachez écrire un fichier d'unité simple avec Restart=on-failure. systemd, journald et la journalisation sont traités en pratique dans notre cours sur Linux.
Questions fréquentes
Comment savoir si mon système utilise systemd ?
Exécutez ps -p 1 -o comm= — si la sortie est systemd, le système tourne sous systemd. Le répertoire /run/systemd/system n'existe d'ailleurs que lorsque le système a démarré avec systemd.
Quelle est la différence entre systemctl restart et reload ?
restart arrête complètement le service puis le relance, les connexions sont coupées. reload demande au service de relire sa configuration sans s'arrêter, mais cela ne fonctionne que si l'unité définit ExecReload.
Peut-on lancer des services systemd sans sudo, en tant qu'utilisateur ordinaire ?
Oui, systemd dispose d'une instance utilisateur : les unités se placent dans ~/.config/systemd/user/ et se gèrent avec systemctl --user. Pour qu'elles tournent sans session active, activez loginctl enable-linger pour l'utilisateur.
Pourquoi un service est-il en état failed, et comment réinitialiser cet état ?
Cherchez la cause dans journalctl -u nom -b et dans la ligne Active de status. Après correction, relancez le service ; la marque failed s'efface avec systemctl reset-failed.
Où sont stockés les journaux systemd sur le disque ?
Avec un stockage permanent, dans /var/log/journal/ au format binaire ; sinon dans /run/log/journal/, en mémoire. Lisez-les avec journalctl, et non avec des outils texte.
Ce sujet est traité en détail avec de la pratique dans le cours « Linux: с нуля до уверенного администрирования ».
- systemd: как на самом деле запускаются сервисы в современном Linux
- Журналы и мониторинг: journald, rsyslog и sysstat