Devmind.
Menu

Apprendre, à votre rythme

Tous les cursus sont accessibles sans compte.

Chapitre 1 / Notion

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.

◷ 19 minutesTravail sur votre machine

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 : start lance maintenant, enable active au boot. Une app start sans enable ne 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-reload après avoir édité une unit : systemd lit l'ancienne version.
  • Restart=always sans RestartSec sur une app qui crash au boot : boucle de restart qui noie les logs.
  • Timer sans Persistent sur 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.

Pas de correction en ligneConfrontez votre code aux résultats attendus du cours.