systemd : gérer des services
En prod, ton app ne tourne pas dans un terminal : c'est un service qui démarre au boot, redémarre en cas de crash et journalise.
Prérequis (cursus dev) : processus et signaux, utilisateurs et services.
Pourquoi
En prod, ton app ne tourne pas dans un terminal : c'est un service qui démarre au boot, redémarre en cas de crash et journalise. systemd, c'est le chef d'orchestre (le processus n°1 qui supervise tout). Le comprendre, c'est arrêter de subir les « ça marchait hier ».
Concepts
- Service (unit) : une tâche décrite dans un fichier
.service: qui la lance, comment, avec quels droits, que faire en cas de crash. enable≠start:startlance maintenant,enableactive au boot. Une appstartsansenablene remonte pas après un reboot — classique du « tout marchait, puis le provider a rebooté ».- cron : le planificateur historique (une ligne = une tâche périodique), sans logs intégrés ni retries. Les timers systemd le remplacent : même idée, avec journal et gestion d'échec.
Exemple : cycle de vie et unit
systemctl status mon-app # état + 10 dernières lignes de log
systemctl enable --now mon-app # les deux d'un coup : boot + maintenant
journalctl -u mon-app -f # logs temps réel
journalctl -u mon-app --since "1 hour ago" -p err
/etc/systemd/system/mon-app.service :
[Unit]
Description=Mon app Node
After=network.target postgresql.service
Wants=postgresql.service
[Service]
User=monapp
Group=monapp
WorkingDirectory=/opt/mon-app
ExecStart=/usr/bin/node dist/main.js
Restart=always
RestartSec=5
# Confinement de base : l'app ne voit que son dossier
ProtectSystem=strict
ReadWritePaths=/opt/mon-app
[Install]
WantedBy=multi-user.target
Puis systemctl daemon-reload && systemctl enable --now mon-app. Vérifier avec systemctl is-enabled et un curl réel sur l'app.
Cas réel : le timer de sauvegarde
# /etc/systemd/system/backup.timer
[Timer]
OnCalendar=*-*-* 04:30:00
Persistent=true
Persistent=true : si la machine dormait à 4h30, le job part au réveil au lieu d'être sauté. systemctl list-timers montre le prochain déclenchement — un timer jamais vérifié est un vœu pieux.
Pièges
- Oublier
daemon-reloadaprès avoir édité une unit : systemd lit l'ancienne version. Restart=alwayssansRestartSecsur une app qui crash au boot : boucle de restart qui noie les logs.- Timer sans
Persistentsur une machine qui s'éteint : créneaux sautés en silence.
À retenir
enable ≠ start, daemon-reload après chaque édition, Restart=always, journalctl pour tout voir, timers persistants vérifiés.