Aller au contenu

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.

/etc/systemd/system/sauvegarde.service :

[Unit]
Description=Sauvegarde quotidienne
[Service]
Type=oneshot
ExecStart=/usr/local/bin/sauvegarde.sh
User=root

/etc/systemd/system/sauvegarde.timer :

[Unit]
Description=Planification de la sauvegarde
[Timer]
OnCalendar=*-*-* 03:30:00
RandomizedDelaySec=15m
Persistent=true
[Install]
WantedBy=timers.target
Fenêtre de terminal
sudo chmod +x /usr/local/bin/sauvegarde.sh
systemd-analyze verify /etc/systemd/system/sauvegarde.service /etc/systemd/system/sauvegarde.timer
sudo systemctl daemon-reload
sudo systemctl enable --now sauvegarde.timer # on active le TIMER, pas le service
systemctl list-timers sauvegarde.timer

Le 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 :

Fenêtre de terminal
sudo systemctl start sauvegarde.service
journalctl -u sauvegarde.service -n 20 --no-pager
NEXT LEFT LAST PASSED UNIT ACTIVATES
Tue 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é

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 :

Fenêtre de terminal
systemd-analyze calendar "Mon..Fri 03:30" --iterations=3
systemd-analyze calendar daily weekly "*:0/15"

Résultat (extrait) : forme normalisée (Mon..Fri *-*-* 03:30:00), prochaine échéance et temps restant.

[Timer]
OnBootSec=5min # 5 minutes après le démarrage de la machine
OnUnitActiveSec=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
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
Fenêtre de terminal
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.sh
systemctl list-timers --all
sudo systemctl stop essai-timer.timer

Pratique pour une tâche ponctuelle sans écrire de fichier (perdue au redémarrage).

/etc/systemd/system/sauvegarde.service
[Unit]
Description=Sauvegarde quotidienne
OnFailure=alerte@%n.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/sauvegarde.sh
# /etc/systemd/system/alerte@.service
[Unit]
Description=Alerte pour %i
[Service]
Type=oneshot
ExecStart=/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.

Fenêtre de terminal
systemctl list-timers --all --no-pager
systemctl status sauvegarde.timer sauvegarde.service
journalctl -u sauvegarde.service --since today
systemctl --failed
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é.

Fenêtre de terminal
mkdir -p ~/.config/systemd/user
# créer rappel.service et rappel.timer dans ce dossier
systemctl --user daemon-reload
systemctl --user enable --now rappel.timer
systemctl --user list-timers
loginctl enable-linger $USER # pour qu'ils tournent sans session ouverte
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.