skip to content

Recherche

Syspirit
FR

Systemd

Gérer les services Linux avec systemd : systemctl, journalctl, units et timers, avec les écarts entre Debian, Ubuntu et RHEL !

Linux
Publié le
Karl Certa

Systemd est le gestionnaire de services et le PID 1 de la quasi-totalité des distributions Linux. Il démarre les services, gère leurs dépendances, collecte leurs logs dans le journal et planifie des tâches via ses timers.

🐧 Ce qui change selon la distribution

Les commandes systemctl sont identiques partout. Ce qui varie, c’est la version de systemd livrée, donc les options disponibles, et les choix propres à chaque distribution. Pour connaître la vôtre : systemctl --version.

📌 Distribution📦 Version de systemd⚠️ Particularité de la distribution
🌀 Debian 12 bookworm252rsyslog n’est plus installé par défaut, /var/log/syslog absent
🌀 Debian 13 trixie257Config par défaut sous /usr/lib/systemd/
🟠 Ubuntu 22.04 LTS249SSH en activation par socket depuis la 22.10
🟠 Ubuntu 24.04 LTS255ssh.socket écoute à la place de ssh.service
🟠 Ubuntu 26.04 LTS259Support des anciens cgroup v1 définitivement supprimé
🔴 RHEL / Rocky / Alma 9252Les scripts SysV sont encore pris en charge
🔴 RHEL / Rocky / Alma 10257Scripts SysV dépréciés, à convertir en units

Alpine et Devuan font exception : elles tournent sous OpenRC ou sysvinit, aucune commande de cette fiche n’y fonctionne.

⚙️ Gestion des services

📌 Action🧠 Commande
▶️ Démarrersudo systemctl start <unit>
⏹️ Arrêtersudo systemctl stop <unit>
🔁 Redémarrersudo systemctl restart <unit>
🔄 Recharger la configsudo systemctl reload <unit>
🚀 Activer au démarragesudo systemctl enable <unit>
⚡ Activer et démarrersudo systemctl enable --now <unit>
🚫 Désactiver au démarragesudo systemctl disable --now <unit>
🔒 Interdire tout démarragesudo systemctl mask <unit>
🔓 Lever l’interdictionsudo systemctl unmask <unit>
♻️ Prendre en compte un unit modifiésudo systemctl daemon-reload

🏷️ Noms de services selon la distribution

C’est là que les copier-coller entre distributions échouent.

📌 Service🌀 Debian / Ubuntu🔴 RHEL / Rocky / Alma / Fedora🟢 openSUSE
🔐 SSHssh (+ ssh.socket sur Ubuntu)sshdsshd
⏰ Croncroncrondcron
🌐 Apacheapache2httpdapache2
🛡️ Pare-feuufw ou nftablesfirewalldfirewalld
🕐 Horlogesystemd-timesyncdchronydchronyd

🔍 État et inventaire

📌 Action🧠 Commande
📊 Statut détaillésystemctl status <unit>
✅ Le service tourne ?systemctl is-active <unit>
🚀 Activé au boot ?systemctl is-enabled <unit>
📋 Services chargéssystemctl list-units --type=service
🗂️ Tous les services installéssystemctl list-unit-files --type=service
❌ Services en échecsystemctl --failed
📄 Contenu réel de l’unitsystemctl cat <unit>

📜 Lire le journal d’un service

journalctl fait partie de systemd. Le démon systemd-journald capte la sortie de chaque service et l’indexe par unit, ce qui permet de filtrer avec -u. C’est le prolongement de systemctl status, qui n’affiche que les dix dernières lignes.

📌 Action🧠 Commande
📖 Logs d’un servicejournalctl -u nginx
🔟 Les 50 dernières lignesjournalctl -u nginx -n 50 --no-pager
👀 Suivre en directjournalctl -u nginx -f
🔀 Suivre plusieurs servicesjournalctl -f -u nginx -u php8.2-fpm
🕐 Depuis un momentjournalctl -u nginx --since "2 hours ago"
🔴 Erreurs uniquementjournalctl -u nginx -p err
🥾 Boot courant / précédentjournalctl -b / journalctl -b -1
🆘 Dernières erreurs commentéesjournalctl -xe

Pour la place occupée par le journal et sa purge, voir la fiche Espace disque.

📄 Anatomie d’un unit

[Unit]
Description=Sauvegarde applicative
After=network-online.target       # Attend le réseau réellement joignable
Wants=network-online.target       # Dépendance souple, pas bloquante
 
[Service]
Type=simple                       # simple : le process reste au premier plan
                                  # oneshot : s'exécute puis se termine
User=backup                       # Ne jamais laisser root sans raison
ExecStart=/opt/scripts/backup.sh
Restart=on-failure                # no, on-failure, always
RestartSec=30                     # Attente avant relance
 
[Install]
WantedBy=multi-user.target        # Cible qui déclenche le service au boot
📌 Action🧠 Commande
➕ Ajouter une surchargesudo systemctl edit <unit>
📝 Copier l’unit completsudo systemctl edit --full <unit>
🔙 Revenir à l’originalsudo systemctl revert <unit>

📂 Emplacements et priorité

📌 Chemin🧠 Rôle📊 Priorité
/etc/systemd/system/Vos units et surchargesLa plus forte
/usr/lib/systemd/system/Units fournis par les paquetsLa plus faible
~/.config/systemd/user/Units utilisateur (--user)Session

Sur Debian et Ubuntu, /lib/systemd/system/ reste visible : depuis la fusion de /usr, ce n’est qu’un lien symbolique vers /usr/lib/systemd/system/.

⏱️ Timers, l’alternative à cron

📌 Action🧠 Commande
📋 Lister les timers actifssystemctl list-timers
▶️ Activer un timersudo systemctl enable --now backup.timer
🧪 Déclencher à la mainsudo systemctl start backup.service
📅 Tester une expressionsystemd-analyze calendar "Mon *-*-* 02:30:00"
# /etc/systemd/system/backup.timer
[Unit]
Description=Sauvegarde quotidienne
 
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true      # Rattrape l'exécution manquée si la machine était éteinte
 
[Install]
WantedBy=timers.target
📌 CritèreCron⏱️ Timer systemd
🧠 SyntaxeCompacte, cinq champsVerbeuse, deux fichiers
📜 LogsMTA ou fichier à partDans le journal, journalctl -u
🔁 RattrapageNon, sauf anacronPersistent=true

🎯 Cibles et démarrage

📌 Action🧠 Commande
🎯 Cible par défautsystemctl get-default
🖥️ Démarrer en mode consolesudo systemctl set-default multi-user.target
🚑 Mode secourssudo systemctl rescue
⏱️ Durée du bootsystemd-analyze
🐌 Services les plus lentssystemd-analyze blame

🛠️ Dépannage courant

🆘 Problème🧠 Solution
❌ Modification d’unit sans effetsystemctl daemon-reload avant le restart
🔁 Le service redémarre en boucleVérifier Restart= et lire journalctl -u <unit> -b
🚫 Unit is maskedsystemctl unmask <unit>
📭 journalctl ne renvoie rienJournal volatile, créer /var/log/journal
🐢 Service lancé trop tôtAfter=network-online.target plutôt que network.target
📄 /var/log/syslog introuvableNormal depuis Debian 12, tout passe par journalctl
📄 /var/log/messages introuvableNormal sur Debian et Ubuntu, c’est un chemin RHEL

🧭 Anciens réflexes et équivalents

📌 Ancienne commande🧠 Équivalent systemd
service nginx restartsystemctl restart nginx
chkconfig nginx onsystemctl enable nginx
chkconfig --listsystemctl list-unit-files
shutdown -r nowsystemctl reboot
tail -f /var/log/messagesjournalctl -f