⚙️ Systemd

systemctl, journald, units, timers, targets

Aide-mémoire

Systemd — Aide-mémoire

systemctl — Gestion des services

# État
systemctl status nginx              # État détaillé
systemctl status 'nginx*'           # Pattern glob
systemctl is-active nginx           # active / inactive (code retour 0/1)
systemctl is-enabled nginx          # enabled / disabled
systemctl is-failed nginx           # failed (code retour 0/1)

Démarrer / Arrêter

systemctl start nginx systemctl stop nginx systemctl restart nginx # Stop + Start systemctl reload nginx # Recharge la config sans redémarrer systemctl reload-or-restart nginx # Reload si possible, sinon restart

Activer au démarrage

systemctl enable nginx # Activer systemctl enable --now nginx # Activer + démarrer immédiatement systemctl disable nginx # Désactiver systemctl disable --now nginx # Désactiver + arrêter systemctl mask nginx # Empêcher tout démarrage (même manuel) systemctl unmask nginx

Recharger la config systemd

systemctl daemon-reload # Après modification d'un unit file systemctl reset-failed # Remettre à zéro les unités en échec

Lister les unités

systemctl list-units                          # Unités actives
systemctl list-units --all                    # Toutes (actives + inactives)
systemctl list-units --state=failed           # Uniquement en échec
systemctl list-units --type=service           # Filtrer par type
systemctl list-unit-files                     # Fichiers d'unités (enabled/disabled)
systemctl list-unit-files --type=timer        # Tous les timers
systemctl list-timers --all                   # Timers + prochaine exécution
systemctl list-dependencies nginx             # Dépendances d'un service

Fichiers d'unité — Emplacement

/lib/systemd/system/          # Units du système (paquets)
/usr/lib/systemd/system/      # Units du système (alternatif)
/etc/systemd/system/          # Overrides locaux (prioritaire)
~/.config/systemd/user/       # Units utilisateur (--user)

Structure d'un fichier .service

[Unit]
Description=Mon Application Web
Documentation=https://exemple.com/docs
After=network-online.target postgresql.service
Wants=network-online.target
Requires=postgresql.service    # Dépendance forte (s'arrête si postgres s'arrête)

[Service]

Type=simple # simple | forking | oneshot | notify | idle User=monapp Group=monapp WorkingDirectory=/opt/monapp ExecStart=/usr/bin/node /opt/monapp/server.js ExecReload=/bin/kill -HUP $MAINPID ExecStop=/bin/kill -TERM $MAINPID

Redémarrage

Restart=on-failure # no | always | on-failure | on-abnormal RestartSec=5s StartLimitIntervalSec=60s # Fenêtre de comptage StartLimitBurst=3 # Max 3 redémarrages dans la fenêtre

Environnement

Environment="NODE_ENV=production" "PORT=3000" EnvironmentFile=/etc/monapp/env # Fichier .env (un KEY=value par ligne)

Sécurité

NoNewPrivileges=true ProtectSystem=strict ProtectHome=true PrivateTmp=true ReadWritePaths=/var/lib/monapp

Logs

StandardOutput=journal StandardError=journal SyslogIdentifier=monapp # Tag dans journald

[Install]

WantedBy=multi-user.target

Override sans modifier l'original

# Créer un override (s'applique par-dessus le service système)
systemctl edit nginx           # Crée /etc/systemd/system/nginx.service.d/override.conf
systemctl edit --full nginx    # Copie complète dans /etc/systemd/system/

Exemple d'override pour augmenter les limites

/etc/systemd/system/nginx.service.d/override.conf

[Service] LimitNOFILE=65536 Environment="NGINX_OPTS=-g 'daemon off;'"

Timers — Alternative aux crons

# /etc/systemd/system/backup.timer
[Unit]
Description=Backup quotidien

[Timer]

OnCalendar=--* 02:30:00 # Chaque jour à 2h30 RandomizedDelaySec=15m # Décalage aléatoire jusqu'à 15min Persistent=true # Rattraper si manqué (ex: machine éteinte)

[Install]

WantedBy=timers.target
# Syntaxe OnCalendar
OnCalendar=hourly              # = -- :00:00
OnCalendar=daily               # = --* 00:00:00
OnCalendar=weekly              # = Mon --* 00:00:00
OnCalendar=monthly             # = --01 00:00:00
OnCalendar=Mon,Thu 08:00       # Lundi et jeudi à 8h
OnCalendar=*:0/15              # Toutes les 15 minutes

Tester une expression

systemd-analyze calendar "Mon,Thu 08:00" systemd-analyze calendar --iterations=5 "daily"

journald — Logs

# Logs d'un service
journalctl -u nginx                         # Tous les logs
journalctl -u nginx -f                      # Suivre en temps réel (tail -f)
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx --since "2024-01-15" --until "2024-01-16"
journalctl -u nginx -n 100                  # 100 dernières lignes
journalctl -u nginx -p err                  # Seulement les erreurs
journalctl -u nginx --no-pager | grep 502   # Pipe vers grep

Filtres avancés

journalctl -p err..crit # Plage de priorité journalctl _PID=1234 # Par PID journalctl _UID=1000 # Par UID journalctl /usr/bin/nginx # Par exécutable

Boot

journalctl -b # Boot courant journalctl -b -1 # Boot précédent journalctl --list-boots # Lister tous les boots

Gestion de l'espace

journalctl --disk-usage journalctl --vacuum-size=500M # Garder max 500 Mo journalctl --vacuum-time=2weeks # Garder max 2 semaines

Targets (anciens runlevels)

systemctl get-default                       # Target par défaut
systemctl set-default multi-user.target     # Changer le défaut
systemctl isolate rescue.target             # Basculer en mode rescue
systemctl reboot
systemctl poweroff
systemctl suspend
systemctl hibernate

Correspondance runlevels

runlevel 1 → rescue.target

runlevel 3 → multi-user.target

runlevel 5 → graphical.target

Analyse du démarrage

systemd-analyze                             # Temps de boot total
systemd-analyze blame                       # Services triés par temps de démarrage
systemd-analyze critical-chain             # Chemin critique du démarrage
systemd-analyze plot > boot.svg            # Graphe SVG du démarrage
systemd-analyze verify /etc/systemd/system/monapp.service  # Valider un unit file

Troubleshooting

# Service qui ne démarre pas
journalctl -u monservice -n 50 --no-pager  # Voir les erreurs
systemctl status monservice                # Code d'exit, signal
systemctl show monservice                  # Toutes les propriétés

Trouver pourquoi un service est en échec

journalctl -xe # Logs récents avec contexte

Vérifier les dépendances

systemctl list-dependencies monservice --all

Simuler le démarrage

systemd-run --unit=test --pty /bin/bash # Shell dans un scope systemd

Gestion des sockets et scopes

# Socket activation
systemctl list-sockets
systemctl status *.socket

Scope (processus créés par systemd-run)

systemd-run --scope --unit=ma-tache mon-script.sh systemctl status ma-tache.scope
🔧 Ouvrir tools.rdr-it.com — application complète →

Plus de 40 outils AdminSys gratuits · SSL · DNS · Docker · Nginx · SSH · Mermaid · et plus