systemd : timers (planification)
Un timer déclenche un service à une date ou à intervalle. C’est l’alternative moderne à cron, avec journalisation, dépendances et rattrapage des exécutions manquées. Les exemples utilisent un script de sauvegarde fictif.
Deux fichiers : le service et le timer
Section intitulée « Deux fichiers : le service et le timer »/etc/systemd/system/sauvegarde.service :
[Unit]Description=Sauvegarde quotidienne
[Service]Type=oneshotExecStart=/usr/local/bin/sauvegarde.shUser=root/etc/systemd/system/sauvegarde.timer :
[Unit]Description=Planification de la sauvegarde
[Timer]OnCalendar=*-*-* 03:30:00RandomizedDelaySec=15mPersistent=true
[Install]WantedBy=timers.targetsudo chmod +x /usr/local/bin/sauvegarde.shsystemd-analyze verify /etc/systemd/system/sauvegarde.service /etc/systemd/system/sauvegarde.timersudo systemctl daemon-reloadsudo systemctl enable --now sauvegarde.timer # on active le TIMER, pas le servicesystemctl list-timers sauvegarde.timerLe timer déclenche le service portant le même nom (sauvegarde.timer → sauvegarde.service) ; Unit= permet d’en désigner un autre.
Lancer le travail à la main, pour tester :
sudo systemctl start sauvegarde.servicejournalctl -u sauvegarde.service -n 20 --no-pagerLire list-timers
Section intitulée « Lire list-timers »NEXT LEFT LAST PASSED UNIT ACTIVATESTue 2026-10-06 03:40:28 UTC 11h - - sauvegarde.timer sauvegarde.service| Colonne | Signification |
|---|---|
NEXT |
Prochaine exécution (avec le délai aléatoire éventuel) |
LEFT |
Temps restant |
LAST, PASSED |
Dernière exécution et temps écoulé |
Syntaxe d’OnCalendar
Section intitulée « Syntaxe d’OnCalendar »Format : JourSemaine Année-Mois-Jour Heure:Minute:Seconde.
| Expression | Signification |
|---|---|
daily |
Tous les jours à 00:00 |
weekly |
Tous les lundis à 00:00 |
*-*-* 02:00:00 |
Tous les jours à 2 h |
Mon..Fri 03:30 |
Du lundi au vendredi à 3 h 30 |
*:0/15 |
Toutes les 15 minutes |
*-*-01 04:00 |
Le 1er de chaque mois à 4 h |
Sat,Sun 22:00 |
Samedi et dimanche à 22 h |
*-*-* 00/6:00 |
Toutes les 6 heures |
Vérifier une expression avant de l’utiliser :
systemd-analyze calendar "Mon..Fri 03:30" --iterations=3systemd-analyze calendar daily weekly "*:0/15"Résultat (extrait) : forme normalisée (Mon..Fri *-*-* 03:30:00), prochaine échéance et temps restant.
Timers relatifs : OnBootSec et OnUnitActiveSec
Section intitulée « Timers relatifs : OnBootSec et OnUnitActiveSec »[Timer]OnBootSec=5min # 5 minutes après le démarrage de la machineOnUnitActiveSec=1h # puis toutes les heures après la fin de la dernière exécution| Directive | Point de départ |
|---|---|
OnBootSec |
Démarrage de la machine |
OnStartupSec |
Démarrage de systemd |
OnActiveSec |
Activation du timer |
OnUnitActiveSec |
Dernière activation du service |
OnUnitInactiveSec |
Dernière désactivation du service |
Options importantes
Section intitulée « Options importantes »| Option | Rôle |
|---|---|
Persistent=true |
Rattrape une exécution manquée (machine éteinte) au prochain démarrage |
RandomizedDelaySec=15m |
Retard aléatoire : évite que plusieurs machines frappent un serveur au même moment |
AccuracySec=1s |
Précision de déclenchement (1 minute par défaut) |
OnCalendar= plusieurs fois |
Plusieurs horaires pour un même timer |
Timers transitoires avec systemd-run
Section intitulée « Timers transitoires avec systemd-run »sudo systemd-run --on-active=30 --unit=essai-timer /bin/sh -c 'echo coucou >> /tmp/essai.log'sudo systemd-run --on-calendar="*-*-* 18:00" --unit=rappel /usr/local/bin/rappel.shsystemctl list-timers --allsudo systemctl stop essai-timer.timerPratique pour une tâche ponctuelle sans écrire de fichier (perdue au redémarrage).
Être prévenu en cas d’échec : OnFailure
Section intitulée « Être prévenu en cas d’échec : OnFailure »[Unit]Description=Sauvegarde quotidienneOnFailure=alerte@%n.service
[Service]Type=oneshotExecStart=/usr/local/bin/sauvegarde.sh# /etc/systemd/system/alerte@.service[Unit]Description=Alerte pour %i
[Service]Type=oneshotExecStart=/usr/local/bin/alerter.sh "%i a échoué"Quand sauvegarde.service échoue, systemd lance alerte@sauvegarde.service.service : le script alerter.sh peut envoyer un e-mail ou un message. Testé : un service dont ExecStart=/bin/false déclenche bien l’unité d’alerte.
Surveiller et diagnostiquer
Section intitulée « Surveiller et diagnostiquer »systemctl list-timers --all --no-pagersystemctl status sauvegarde.timer sauvegarde.servicejournalctl -u sauvegarde.service --since todaysystemctl --failedTimers ou cron ?
Section intitulée « Timers ou cron ? »| Critère | Timer systemd | cron |
|---|---|---|
| Journalisation | Intégrée (journalctl -u) |
À gérer (redirections, mail) |
| Rattrapage d’une exécution manquée | Persistent=true |
Non (sauf anacron) |
| Dépendances et ordre | Oui | Non |
| Limites de ressources, sandbox | Oui (directives du service) | Non |
| Environnement | Défini et reproductible | Minimal et variable |
| Simplicité | 2 fichiers | 1 ligne de crontab -e |
Pour une tâche simple, cron reste valable (voir Bash : bonnes pratiques). Les timers conviennent dès qu’il faut des journaux, du rattrapage ou de la sécurité.
Timers utilisateur
Section intitulée « Timers utilisateur »mkdir -p ~/.config/systemd/user# créer rappel.service et rappel.timer dans ce dossiersystemctl --user daemon-reloadsystemctl --user enable --now rappel.timersystemctl --user list-timersloginctl enable-linger $USER # pour qu'ils tournent sans session ouverteDépannage
Section intitulée « Dépannage »| Symptôme | Piste |
|---|---|
| Le timer ne se déclenche jamais | Le timer n’est pas activé (enable --now), ou OnCalendar invalide : systemd-analyze calendar |
| Déclenché avec du retard | RandomizedDelaySec ou AccuracySec (1 minute par défaut) |
| Le service n’a pas tourné pendant l’arrêt de la machine | Ajouter Persistent=true |
Failed to parse calendar specification |
Expression incorrecte : tester avec systemd-analyze calendar |
| Le travail s’exécute mais échoue | journalctl -u sauvegarde.service : chemins absolus, droits, variables d’environnement |
Unit … not found |
daemon-reload oublié, ou mauvais nom (.timer et .service doivent correspondre) |
Ubuntu 24.04 et 26.04 : différences à connaître
Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »Les timers fonctionnent de la même façon sur systemd 255 et 259.
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Manuel :
man systemd.timer,man systemd.time - Suite : Journal (journald)