| name | systemd-manager |
| description | Gestion de services avec systemd — units, timers, journalctl, boot et dépendances entre services. Se déclenche avec "systemd", "systemctl", "service Linux", "journalctl", "unit file", "timer systemd". Also triggers on "systemd unit", "systemd timer", "journalctl logs". |
Systemd Manager
Workflow
1. Identifier le besoin et le type d'unité
| Besoin | Type d'unité |
|---|
| Démon applicatif | .service |
| Tâche planifiée | .timer + .service |
| Démarrage sur connexion réseau | .socket |
| Montage de système de fichiers | .mount / .automount |
| Regrouper des services | .target |
| Surveiller un fichier/dossier | .path |
Vérifier si une unité existe déjà :
systemctl list-unit-files | grep monapp
systemctl cat monapp.service
2. Créer un fichier .service
Emplacement : /etc/systemd/system/monapp.service
[Unit]
Description=Mon application Go
Documentation=https://example.com/docs
After=network-online.target postgresql.service
Wants=network-online.target
Requires=postgresql.service
[Service]
Type=simple
User=monapp
Group=monapp
WorkingDirectory=/opt/monapp
ExecStart=/opt/monapp/bin/monapp --config /etc/monapp/config.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
StartLimitIntervalSec=60s
StartLimitBurst=3
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
ReadWritePaths=/var/lib/monapp /var/log/monapp
EnvironmentFile=-/etc/monapp/env
Environment="LOG_LEVEL=info"
[Install]
WantedBy=multi-user.target
Activer et démarrer :
systemctl daemon-reload
systemctl enable --now monapp.service
systemctl status monapp.service
3. Créer un timer (remplacement cron)
Deux fichiers du même nom (backup.timer + backup.service) :
[Unit]
Description=Sauvegarde quotidienne à 2h
[Timer]
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=300
Persistent=true
[Install]
WantedBy=timers.target
[Unit]
Description=Script de sauvegarde
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=backup
systemctl enable --now backup.timer
systemctl list-timers --all
Syntaxes OnCalendar= utiles :
daily # 00:00:00 chaque jour
weekly # lundi 00:00
Mon-Fri 09:00 # jours ouvrés à 9h
*:0/15 # toutes les 15 minutes
2026-*-1 00:00 # 1er de chaque mois
4. Cycle de vie et commandes essentielles
systemctl start|stop|restart|reload monapp
systemctl enable|disable monapp
systemctl mask|unmask monapp
systemctl status monapp
systemctl show monapp
systemctl list-dependencies monapp
systemctl list-units --state=failed
systemctl edit monapp
systemctl edit --full monapp
systemctl revert monapp
Après toute modification de fichier unit :
systemctl daemon-reload
5. Analyser les logs avec journalctl
journalctl -u monapp
journalctl -u monapp -n 100 --no-pager
journalctl -u monapp -f
journalctl -u monapp --since "1 hour ago"
journalctl -u monapp --since "2026-06-24 08:00" --until "2026-06-24 09:00"
journalctl -u monapp -p err
journalctl -u monapp -p warning..err
journalctl --list-boots
journalctl -u monapp -b -1
journalctl -u monapp -o json-pretty
journalctl -u monapp --output=cat
journalctl --vacuum-size=500M
journalctl --vacuum-time=30d
6. Diagnostiquer les problèmes de boot
systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain
systemd-analyze plot > boot.svg
systemd-analyze verify monapp.service
7. Sécuriser un service
Évaluer le score de sécurité actuel :
systemd-analyze security monapp.service
Options de sandboxing par ordre d'impact :
[Service]
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
PrivateDevices=yes
ProtectKernelTunables=yes
ProtectControlGroups=yes
RestrictSUIDSGID=yes
SystemCallFilter=@system-service
CapabilityBoundingSet=
AmbientCapabilities=
Garde-fous / Anti-patterns
Ne jamais modifier /lib/systemd/system/ — écrasé à chaque mise à jour du paquet. Toujours utiliser /etc/systemd/system/ ou systemctl edit.
Oublier daemon-reload après modification d'un fichier unit : systemd continue d'utiliser la version en mémoire. Le service peut sembler "fonctionner" avec la vieille config.
Type=forking mal configuré sans PIDFile= : systemd ne peut pas suivre le PID du processus fils et le considère mort immédiatement.
Boucle de redémarrage infinie avec Restart=always sans StartLimitBurst : un service qui plante immédiatement monopolise les ressources. Toujours coupler :
Restart=on-failure
RestartSec=10s
StartLimitIntervalSec=120s
StartLimitBurst=5
After=network.target insuffisant pour les services qui ont besoin d'une IP assignée : utiliser After=network-online.target + Wants=network-online.target.
Variables d'env dans ExecStart via $VAR sans les déclarer dans Environment= ou EnvironmentFile= : elles ne sont PAS héritées du shell courant.
Timer sans Persistent=true pour les tâches critiques : si la machine est éteinte à l'heure prévue, la tâche ne sera jamais rattrapée.
Bonnes pratiques 2026
- Prefer
Type=notify pour les services modernes qui supportent sd_notify() — systemd sait exactement quand le service est prêt.
- Utiliser
RuntimeDirectory= / StateDirectory= / LogsDirectory= plutôt que de créer les dossiers manuellement dans les scripts d'init.
- Isoler les credentials avec
LoadCredential= (systemd 247+) : stocker les secrets hors de l'EnvironmentFile, accessibles via $CREDENTIALS_DIRECTORY.
- Activer le rate-limiting des logs via
LogRateLimitIntervalSec= et LogRateLimitBurst= pour éviter la saturation du journal sur un service verbeux.
- Versionner les unit files dans un dépôt Git et les déployer via Ansible/Salt — pas de modification manuelle en production.
- Tester la syntaxe avant de déployer :
systemd-analyze verify /etc/systemd/system/monapp.service.