Guide de référence complet pour systemd: gestion des services, journaux, units, et timers.
1. systemctl - Gestion des Services
Commandes de Base
Action
Commande
Description
Start
systemctl start <service>
Démarrer un service
Stop
systemctl stop <service>
Arrêter un service
Restart
systemctl restart <service>
Redémarrer un service
Reload
systemctl reload <service>
Recharger la configuration (sans redémarrage)
Status
systemctl status <service>
Voir le statut détaillé
Enable
systemctl enable <service>
Activer au démarrage
Disable
systemctl disable <service>
Désactiver au démarrage
Is-active
systemctl is-active <service>
Vérifier si actif
Is-enabled
systemctl is-enabled <service>
Vérifier si activé au boot
Is-failed
systemctl is-failed <service>
Vérifier si en échec
# Gérer nginxsystemctlstartnginx
systemctlstopnginx
systemctlrestartnginx
systemctlreloadnginx# Recharge config sans couper les connexions# Activer au démarragesystemctlenablenginx
systemctlenable--nownginx# Enable + start en une commande# Désactiver au démarragesystemctldisablenginx
systemctldisable--nownginx# Disable + stop# Voir le statutsystemctlstatusnginx
systemctlstatusnginx-l# Sans troncaturesystemctlstatusnginx-n50# 50 dernières lignes de log# Vérifications rapidessystemctlis-activenginx# Retourne: active/inactivesystemctlis-enablednginx# Retourne: enabled/disabledsystemctlis-failednginx# Retourne: active/failed
Listing des Services
# Lister tous les servicessystemctllist-units--type=service
systemctllist-units--type=service--all# Incluant inactifs# Lister seulement les services actifssystemctllist-units--type=service--state=running
# Lister les services en échecsystemctllist-units--type=service--state=failed
systemctl--failed
# Lister les services activéssystemctllist-unit-files--type=service--state=enabled
# Format simplifiésystemctllist-units--type=service--no-pager
systemctllist-units--type=service-ojson
# Filtrer par nomsystemctllist-units'nginx*'systemctllist-units'*docker*'
Dépendances & Relations
# Voir les dépendances d'un servicesystemctllist-dependenciesnginx
systemctllist-dependenciesnginx--all# Récursif# Voir ce qui dépend d'un servicesystemctllist-dependenciesnginx--reverse
# Arbre de dépendancessystemctllist-dependencies--all--afternginx
systemctllist-dependencies--all--beforenginx
# Voir les propriétés d'un servicesystemctlshownginx
systemctlshownginx-pMainPID,LoadState,ActiveState
# Fichier unit d'un servicesystemctlcatnginx
2. Gestion Avancée des Services
Contrôle des Services
# Redémarrer seulement si déjà actifsystemctltry-restartnginx
# Recharger ou redémarrer (selon disponibilité)systemctlreload-or-restartnginx
# Kill processus d'un servicesystemctlkillnginx
systemctlkill-sSIGKILLnginx# Force kill# Masquer un service (empêche le démarrage)systemctlmasknginx
systemctlunmasknginx
# Isoler un target (comme changer de runlevel)systemctlisolatemulti-user.target
Reset & Troubleshooting
# Reset l'état "failed" d'un servicesystemctlreset-failednginx
systemctlreset-failed# Reset tous# Recharger la configuration systemdsystemctldaemon-reload
# Re-exécuter les générateurssystemctldaemon-reexec
# Voir les logs d'erreur d'un servicesystemctlstatusnginx-l
journalctl-unginx-n50--no-pager
3. journalctl - Logs Systemd
Commandes de Base
Action
Commande
Description
Tout voir
journalctl
Tous les logs
Service
journalctl -u <service>
Logs d'un service
Follow
journalctl -f
Suivre en temps réel
Dernières N lignes
journalctl -n <N>
N dernières entrées
Depuis X temps
journalctl --since "1h ago"
Depuis 1 heure
Priorité
journalctl -p err
Seulement erreurs
Boot actuel
journalctl -b
Logs du boot actuel
Kernel
journalctl -k
Logs kernel
Format
journalctl -o json
Format JSON
# Voir tous les logsjournalctl
# Logs d'un servicejournalctl-unginx
journalctl-unginx.service
# Suivre en temps réel (follow)journalctl-f
journalctl-unginx-f
# Dernières N lignesjournalctl-n100journalctl-unginx-n50# Combine follow + tailjournalctl-unginx-f-n20
Filtres Temporels
# Depuis X tempsjournalctl--since"1 hour ago"journalctl--since"2 days ago"journalctl--since"30 minutes ago"journalctl--sinceyesterday
journalctl--sincetoday
# Jusqu'à X tempsjournalctl--until"2024-01-01 00:00:00"# Période spécifiquejournalctl--since"2024-01-01"--until"2024-01-31"journalctl--since"2024-01-15 10:00"--until"2024-01-15 12:00"# Combiné avec servicejournalctl-unginx--since"1 hour ago"
Filtres par Priorité
# Priorités (de 0 à 7):# 0: emerg - Système inutilisable# 1: alert - Action immédiate requise# 2: crit - Conditions critiques# 3: err - Erreurs# 4: warning - Avertissements# 5: notice - Normal mais significatif# 6: info - Informations# 7: debug - Debug# Seulement erreurs et plus critiquejournalctl-perr
journalctl-p3# Warnings et plusjournalctl-pwarning
journalctl-p4# Seulement un niveaujournalctl-perr--no-pager
Filtres par Boot
# Lister les bootsjournalctl--list-boots
# Boot actueljournalctl-b
journalctl-b0# Boot précédentjournalctl-b-1
# Boot spécifiquejournalctl-b<boot-id>
# Combiner avec servicejournalctl-unginx-b0
Filtres Avancés
# Logs du kerneljournalctl-k
journalctl-k-b# Kernel du boot actuel# Par PIDjournalctl_PID=1234# Par UIDjournalctl_UID=1000# Par exécutablejournalctl/usr/bin/nginx
# Par unité systemdjournalctl-unginx-umysql# Plusieurs services# Reverse (du plus récent au plus ancien)journalctl-r
# Pas de pager (tout afficher)journalctl--no-pager
# Sans couleurjournalctl--no-pager--no-full
Formats de Sortie
# Format court (défaut)journalctl-unginx-n10# Format JSONjournalctl-unginx-n10-ojson
# Format JSON-prettyjournalctl-unginx-n10-ojson-pretty
# Format export (binaire)journalctl-unginx-oexport>nginx.journal
# Format cat (seulement les messages)journalctl-unginx-ocat
# Format verbose (tous les champs)journalctl-unginx-n5-overbose
# Format avec-hostnamejournalctl-oshort-full
journalctl-oshort-iso# Timestamps ISO 8601
Gestion de l'Espace
# Voir l'espace utiliséjournalctl--disk-usage
# Nettoyer les logs (garder seulement X)journalctl--vacuum-time=7d# Garder 7 joursjournalctl--vacuum-size=500M# Garder 500 MB maxjournalctl--vacuum-files=10# Garder 10 fichiers max# Rotation manuellejournalctl--rotate
# Vérifier les logsjournalctl--verify
4. Unit Files
Types de Units
Type
Extension
Description
service
.service
Services et daemons
socket
.socket
Sockets IPC ou réseau
target
.target
Groupes de units (runlevels)
timer
.timer
Timers (cron-like)
mount
.mount
Points de montage
automount
.automount
Montage automatique
device
.device
Périphériques
path
.path
Surveillance de fichiers
slice
.slice
Gestion des ressources
scope
.scope
Processus externes
Localisation des Unit Files
# Chemins des unit files (par ordre de priorité):# 1. /etc/systemd/system/ (Admin, priorité max)# 2. /run/systemd/system/ (Runtime)# 3. /lib/systemd/system/ (Paquets installés)# 4. /usr/lib/systemd/system/ (Distribution)# Voir le fichier d'un servicesystemctlcatnginx
# Éditer un service (crée un override)systemctleditnginx
# Éditer le fichier completsystemctledit--fullnginx
# Recharger après modificationsystemctldaemon-reload
# Type=simple (défaut)# Le processus spécifié dans ExecStart est le processus principal[Service]Type=simpleExecStart=/usr/bin/myapp# Type=forking# Le processus fork et le parent se termine[Service]Type=forkingPIDFile=/var/run/myapp.pidExecStart=/usr/bin/myapp --daemon# Type=oneshot# Pour les scripts qui se terminent (pas de daemon)[Service]Type=oneshotExecStart=/usr/bin/backup.shRemainAfterExit=yes# Type=notify# Le service notifie systemd quand il est prêt[Service]Type=notifyExecStart=/usr/bin/myapp# Type=dbus# Le service acquiert un nom D-Bus[Service]Type=dbusBusName=com.example.myappExecStart=/usr/bin/myapp# Type=idle# Attend que les autres services soient démarrés[Service]Type=idleExecStart=/usr/bin/myapp
Restart Policies
[Service]# Ne jamais redémarrerRestart=no# Toujours redémarrer (sauf stop/disable)Restart=always# Redémarrer sur erreur ou timeoutRestart=on-failure# Redémarrer sauf si exit 0Restart=on-abnormal# Redémarrer si crashRestart=on-abort# Redémarrer si watchdog timeoutRestart=on-watchdog# Options de restartRestartSec=5s# Attendre 5s avant restartStartLimitBurst=5# Max 5 restartsStartLimitIntervalSec=60s# Dans une fenêtre de 60s
5. Timers (Alternative à Cron)
Créer un Timer
# /etc/systemd/system/backup.timer[Unit]Description=Daily backup timerRequires=backup.service[Timer]# DéclenchementOnCalendar=dailyOnCalendar=*-*-* 02:00:00# Tous les jours à 2h#OnCalendar=Mon *-*-* 00:00:00 # Tous les lundis#OnCalendar=*-*-01 00:00:00 # Le 1er de chaque mois# Ou par intervalle#OnBootSec=15min # 15 min après le boot#OnUnitActiveSec=1d # 1 jour après dernière exécution# OptionsPersistent=true# Rattraper les exécutions manquéesAccuracySec=1h# Précision (économie d'énergie)[Install]WantedBy=timers.target
# Activer un timersystemctlenablebackup.timer
systemctlstartbackup.timer
# Lister les timerssystemctllist-timers
systemctllist-timers--all
# Status d'un timersystemctlstatusbackup.timer
# Voir quand un timer va se déclenchersystemctllist-timersbackup.timer
# Logs d'un timerjournalctl-ubackup.timer
journalctl-ubackup.service
# Tester le service manuellementsystemctlstartbackup.service
Exemples de Calendrier
# Syntaxe OnCalendar# Format: DOW YYYY-MM-DD HH:MM:SS# Toutes les heuresOnCalendar=hourlyOnCalendar=*-*-* *:00:00# Tous les jours à 3h30OnCalendar=dailyOnCalendar=*-*-* 03:30:00# Toutes les semaines (dimanche 00:00)OnCalendar=weeklyOnCalendar=Sun *-*-* 00:00:00# Tous les mois (1er à 00:00)OnCalendar=monthlyOnCalendar=*-*-01 00:00:00# Tous les lundis à 9hOnCalendar=Mon *-*-* 09:00:00# Du lundi au vendredi à 8h et 18hOnCalendar=Mon..Fri *-*-* 08,18:00:00# Toutes les 15 minutesOnCalendar=*:0/15# Exemples complexesOnCalendar=Mon,Tue,Wed,Thu,Fri *-*-* 09:00:00# Semaine à 9hOnCalendar=*-*-* 09:00:00,12:00:00,18:00:00# 3x par jourOnCalendar=*-01,04,07,10-01 00:00:00# Trimestriel# Vérifier une expressionsystemd-analyze calendar "Mon *-*-* 09:00:00"systemd-analyze calendar weekly
6. Targets (Runlevels)
Targets Courants
Target
Équivalent Runlevel
Description
poweroff.target
0
Éteindre
rescue.target
1
Mode rescue (single user)
multi-user.target
3
Multi-utilisateur (sans GUI)
graphical.target
5
Multi-utilisateur avec GUI
reboot.target
6
Redémarrer
# Voir le target actuelsystemctlget-default
# Changer le target par défautsystemctlset-defaultmulti-user.target
systemctlset-defaultgraphical.target
# Isoler un target (équivalent à changer de runlevel)systemctlisolatemulti-user.target
systemctlisolategraphical.target
# Lister les targetssystemctllist-units--type=target
# Éteindre/Redémarrersystemctlpoweroff
systemctlreboot
systemctlsuspendsystemctlhibernate
systemctlhybrid-sleep
7. Analyse & Debug
systemd-analyze
# Temps de bootsystemd-analyze
# Temps par servicesystemd-analyzeblame
# Chaîne critique (chemin le plus long)systemd-analyzecritical-chain
# Graphe de démarrage (DOT format)systemd-analyzedot|dot-Tsvg>boot.svg
# Graphe d'un service spécifiquesystemd-analyzedotnginx|dot-Tpng>nginx.png
# Vérifier la syntaxe d'un unit filesystemd-analyzeverify/etc/systemd/system/myapp.service
# Analyser une expression calendarsystemd-analyzecalendar"Mon *-*-* 09:00:00"# Voir la configuration systemdsystemd-analyzecat-configsystemd/system.conf
# Dump de la configurationsystemd-analyzedump
Debugging
# Verbose statussystemctlstatusnginx-l--no-pager
# Voir les logs d'erreurjournalctl-unginx-perr-n50# Debug d'un service qui ne démarre passystemctlstatusmyapp-l
journalctl-umyapp-xe
# Vérifier les dépendancessystemctllist-dependenciesmyapp--all
# Voir pourquoi un service a échouésystemctlstatusmyapp
journalctl-umyapp--since"5 minutes ago"# Tracer l'exécution d'un servicesystemd-run--unit=test--setenv=SYSTEMD_LOG_LEVEL=debug/usr/bin/myapp
# Voir les propriétéssystemctlshowmyapp
# Vérifier le fichier unitsystemctlcatmyapp
systemd-analyzeverify/etc/systemd/system/myapp.service
8. Gestion des Ressources (cgroups)
Limites de Ressources
# Dans le unit file [Service]# CPUCPUQuota=50%# 50% d'un coreCPUShares=1024# Poids relatif (défaut: 1024)CPUAffinity=0,1# Cores 0 et 1# MémoireMemoryLimit=512M# Limite mémoire (deprecated, utiliser MemoryMax)MemoryMax=512M# Limite mémoire stricteMemoryHigh=400M# Seuil avant throttlingMemorySwapMax=1G# Limite swap# IOIOWeight=100# Poids IO (10-1000, défaut: 100)IOReadBandwidthMax=/dev/sda 10M# Limite lectureIOWriteBandwidthMax=/dev/sda 5M# Limite écriture# Tasks/ProcessusTasksMax=100# Max 100 processus/threads# FichiersLimitNOFILE=65536# Max file descriptors
Slices (Groupement)
# Voir les slicessystemctl-tslice
# Slices par défaut:# - system.slice (services système)# - user.slice (sessions utilisateur)# - machine.slice (VMs/containers)# Créer une slice personnalisée# /etc/systemd/system/app.slice[Unit]Description=Applicationslice
[Slice]MemoryMax=2G
CPUQuota=200%
# Utiliser la slice dans un service[Service]Slice=app.slice
9. Sécurité & Isolation
Options de Sécurité
# Dans [Service]# Utilisateur/GroupeUser=myappGroup=myappDynamicUser=yes# Créer user temporaire# FilesystemPrivateTmp=yes# /tmp isoléProtectSystem=strict# Filesystem en lecture seuleProtectHome=yes# /home inaccessibleReadOnlyPaths=/etc /usrReadWritePaths=/var/lib/myappInaccessiblePaths=/root# RéseauPrivateNetwork=yes# Réseau isoléRestrictAddressFamilies=AF_INET AF_INET6# Seulement IPv4/IPv6# CapabilitiesCapabilityBoundingSet=CAP_NET_BIND_SERVICEAmbientCapabilities=CAP_NET_BIND_SERVICENoNewPrivileges=yes# Pas de setuid# NamespacesPrivateDevices=yes# /dev isoléPrivateUsers=yes# User namespaceProtectKernelTunables=yesProtectKernelModules=yesProtectControlGroups=yes# SyscallsSystemCallFilter=@system-serviceSystemCallFilter=~@privileged @resources# RessourcesRestrictRealtime=yesLockPersonality=yesRestrictSUIDSGID=yes
# Rebootsystemctlreboot
reboot
# Poweroffsystemctlpoweroff
poweroff
# Suspendsystemctlsuspend# Hibernatesystemctlhibernate
# Liste compacte des servicessystemctllist-units--type=service--no-pager|greprunning
# Services en erreursystemctl--failed
# Reset tous les services en erreursystemctlreset-failed
# Voir les logs boot actueljournalctl-b
# Logs depuis le dernier bootjournalctl-b-1
# Suivre tous les logsjournalctl-f
# Logs d'un user spécifiquejournalctl_UID=1000
Alias Utiles
# Ajouter dans ~/.bashrc ou ~/.zshrcaliassc='systemctl'aliasscs='systemctl status'aliasscr='systemctl restart'aliassce='systemctl enable'aliasscd='systemctl disable'aliasjc='journalctl'aliasjcf='journalctl -f'aliasjcu='journalctl -u'aliasscf='systemctl --failed'aliasscdr='systemctl daemon-reload'
One-liners
# Lister les services les plus lents au bootsystemd-analyzeblame|head-20
# Trouver les services qui ont crashésystemctllist-units--state=failed
# Redémarrer tous les services en échecsystemctlreset-failed
forservicein$(systemctllist-units--failed--no-legend|awk'{print $1}');dosystemctlrestart"$service"done# Taille des logs par servicejournalctl--disk-usage
forservicein$(systemctllist-units--type=service--no-legend|awk'{print $1}');doecho"$service: $(journalctl-u$service--disk-usage2>/dev/null|grep-oP'\d+\.\d+[KMGT]')"done|sort-hrk2
# Export logs JSONjournalctl-unginx-ojson-pretty--sincetoday>nginx-logs.json
Red Hat systemd Guide: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/configuring_basic_system_settings/assembly_working-with-systemd-unit-files_configuring-basic-system-settings
Aller Plus Loin
Explorez systemd-nspawn pour les containers
Utilisez systemd.resource-control pour la gestion fine des ressources
Apprenez systemd socket activation pour l'optimisation
Maîtrisez systemd-tmpfiles pour la gestion des fichiers temporaires