Aller au contenu
Administration Linux medium

Planifier des tâches avec les timers systemd sous Linux

11 min de lecture

Les timers systemd sont l’alternative moderne à cron. Ils planifient l’exécution de services systemd selon un calendrier (OnCalendar) ou après un délai (OnBootSec, OnUnitActiveSec). Leur avantage principal : la journalisation via journalctl, la gestion des dépendances et la possibilité de rattraper les exécutions manquées avec Persistent=true.

  • Lister les timers actifs et comprendre leur état
  • Distinguer un timer calendaire (OnCalendar) d’un timer monotone (OnBootSec)
  • Analyser un timer existant comme apt-daily.timer
  • Créer un timer personnalisé avec son service associé
  • Activer la persistance pour rattraper les exécutions manquées
  • Valider la syntaxe d’un calendrier avec systemd-analyze calendar

Les timers systemd remplacent progressivement cron sur les distributions modernes :

  • Exécuter une sauvegarde quotidienne avec journalisation automatique
  • Planifier un nettoyage de fichiers temporaires avec contrôle fin de l’intervalle
  • Déclencher une tâche 15 minutes après le démarrage du système
  • S’assurer qu’une tâche manquée (machine éteinte) sera rattrapée au prochain démarrage
  • Bénéficier de journalctl pour diagnostiquer les erreurs d’un job planifié

Pour voir tous les timers du système :

Fenêtre de terminal
systemctl list-timers --all
NEXT LEFT LAST PASSED UNIT ACTIVATES
Sat 2026-06-28 18:19:57 5h 29min left Sat 2026-06-28 06:44:19 6h ago apt-daily-upgrade.timer apt-daily-upgrade.service
Sat 2026-06-28 14:19:18 1h 28min left Sat 2026-06-28 06:32:32 6h ago apt-daily.timer apt-daily.service
Sun 2026-06-29 00:00:00 11h left Sat 2026-06-28 00:00:14 12h ago dpkg-db-backup.timer dpkg-db-backup.service
Sun 2026-06-29 00:00:00 11h left Sat 2026-06-28 00:00:14 12h ago logrotate.timer logrotate.service

Chaque ligne montre :

ColonneSignification
NEXTProchaine exécution prévue
LEFTTemps restant avant la prochaine exécution
LASTDernière exécution
PASSEDTemps écoulé depuis la dernière exécution
UNITNom du timer
ACTIVATESService déclenché

Déclenché à un moment précis, comme cron. Utilise le format OnCalendar :

[Timer]
OnCalendar=*-*-* 03:00:00

Équivalent cron : 0 3 * * * (chaque jour à 3 h).

Déclenché après un délai relatif à un événement (démarrage, dernière exécution, activation) :

[Timer]
OnBootSec=15min
OnUnitActiveSec=1h

Ce timer se déclenche 15 minutes après le démarrage, puis toutes les heures.

DirectiveDéclenchement relatif à
OnBootSecLe démarrage du système
OnStartupSecLe démarrage de systemd (espace utilisateur)
OnActiveSecL’activation du timer lui-même
OnUnitActiveSecLa dernière activation du service associé
OnUnitInactiveSecLa dernière désactivation du service associé

Prenons apt-daily.timer, présent sur Debian/Ubuntu :

Fenêtre de terminal
systemctl cat apt-daily.timer
[Unit]
Description=Daily apt download activities
[Timer]
OnCalendar=*-*-* 6,18:00
RandomizedDelaySec=12h
Persistent=true
[Install]
WantedBy=timers.target
DirectiveEffet
OnCalendar=*-*-* 6,18:00Se déclenche à 6 h et 18 h chaque jour
RandomizedDelaySec=12hAjoute un délai aléatoire jusqu’à 12 h pour étaler la charge
Persistent=trueSi l’exécution a été manquée (machine éteinte), elle est rattrapée au prochain démarrage
Fenêtre de terminal
# Voir le service associé
systemctl cat apt-daily.service

La syntaxe OnCalendar est plus expressive que cron :

DayOfWeek Year-Month-Day Hour:Minute:Second
ExpressionSignification
*-*-* 03:00:00Chaque jour à 3 h
Mon..Fri *-*-* 08:00:00Du lundi au vendredi à 8 h
*-*-01 00:00:00Le 1er de chaque mois à minuit
weeklyChaque semaine (lundi 00:00)
dailyChaque jour (00:00)
hourlyChaque heure
*-*-* *:00/15:00Toutes les 15 minutes
Sat *-*-* 22:00:00Chaque samedi à 22 h

systemd-analyze calendar vérifie la syntaxe et affiche les prochaines exécutions :

Fenêtre de terminal
systemd-analyze calendar 'Mon..Fri *-*-* 08:00'
Original form: Mon..Fri *-*-* 08:00
Normalized form: Mon..Fri *-*-* 08:00:00
Next elapse: Mon 2026-06-29 08:00:00 CEST
(in UTC): Mon 2026-06-29 06:00:00 UTC
From now: 19h left
Fenêtre de terminal
# Tester un calendrier avec plusieurs occurrences
systemd-analyze calendar --iterations=5 'daily'

Créons un timer qui nettoie /tmp chaque jour à 4 h.

  1. Créer le service

    Fenêtre de terminal
    sudo systemctl edit --full --force cleanup-tmp.service
    [Unit]
    Description=Nettoyage des fichiers temporaires de plus de 7 jours
    [Service]
    Type=oneshot
    ExecStart=/usr/bin/find /tmp -type f -mtime +7 -delete
  2. Créer le timer

    Fenêtre de terminal
    sudo systemctl edit --full --force cleanup-tmp.timer
    [Unit]
    Description=Timer quotidien de nettoyage /tmp
    [Timer]
    OnCalendar=*-*-* 04:00:00
    Persistent=true
    [Install]
    WantedBy=timers.target
  3. Activer et démarrer le timer

    Fenêtre de terminal
    sudo systemctl daemon-reload
    sudo systemctl enable --now cleanup-tmp.timer
  4. Vérifier le timer

    Fenêtre de terminal
    systemctl status cleanup-tmp.timer
    ● cleanup-tmp.timer - Timer quotidien de nettoyage /tmp
    Loaded: loaded (/etc/systemd/system/cleanup-tmp.timer; enabled)
    Active: active (waiting)
    Trigger: Sun 2026-06-29 04:00:00 CEST; 15h left
  5. Tester le service manuellement

    Fenêtre de terminal
    sudo systemctl start cleanup-tmp.service
    systemctl status cleanup-tmp.service

Les timers utilisateur se placent dans ~/.config/systemd/user/ et n’ont pas besoin de privilèges root :

Fenêtre de terminal
mkdir -p ~/.config/systemd/user
# Créer le service
cat > ~/.config/systemd/user/mon-backup.service << 'EOF'
[Unit]
Description=Sauvegarde personnelle
[Service]
Type=oneshot
ExecStart=/home/%u/scripts/backup.sh
EOF
# Créer le timer
cat > ~/.config/systemd/user/mon-backup.timer << 'EOF'
[Unit]
Description=Timer de sauvegarde personnelle
[Timer]
OnCalendar=*-*-* 20:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
# Activer
systemctl --user daemon-reload
systemctl --user enable --now mon-backup.timer
systemctl --user list-timers

Par défaut, systemd regroupe les timers dans une fenêtre d’une minute pour économiser les réveils CPU. AccuracySec contrôle cette précision :

[Timer]
OnCalendar=*-*-* 03:00:00
AccuracySec=1s # Exécution précise à la seconde

Un timer de logrotate typique utilise AccuracySec=1h — la précision au jour suffit.

Ajoute un délai aléatoire pour éviter que toutes les machines lancent la même tâche simultanément :

[Timer]
OnCalendar=daily
RandomizedDelaySec=4h # Étalement sur 4 heures

Persistent=true rattrape les exécutions manquées. Si la machine était éteinte à l’heure prévue, le timer se déclenche immédiatement au prochain démarrage :

[Timer]
OnCalendar=daily
Persistent=true
CritèrecronTimers systemd
Journalisationsyslog ou fichierjournalctl -u service
DépendancesAucuneAfter=, Requires=
RattrapageNon (anacron partiellement)Persistent=true
PrécisionÀ la minuteÀ la seconde
AléatoireNonRandomizedDelaySec
Timer monotoneNonOnBootSec, OnUnitActiveSec
Sécurité (sandboxing)NonToutes les options systemd
SimplicitéUne ligne suffitDeux fichiers (.timer + .service)
UniversalitéDisponible partoutSystèmes avec systemd
SymptômeCause probableSolution
Timer n’apparaît pas dans list-timersTimer non activésystemctl enable --now mon.timer
Timer actif mais service jamais déclenchéErreur de syntaxe OnCalendarVérifier avec systemd-analyze calendar
Service échoue silencieusementErreur dans ExecStartjournalctl -u mon-service.service
Timer déclenché en retardAccuracySec trop largeRéduire AccuracySec=1min
Exécution manquée non rattrapéePersistent absentAjouter Persistent=true
Timer utilisateur inactif après rebootSession non persistanteloginctl enable-linger $USER
Fenêtre de terminal
# Diagnostiquer un timer
systemctl status mon-job.timer
journalctl -u mon-job.service --since today
# Vérifier la prochaine exécution
systemd-analyze calendar 'OnCalendar expression'
# Forcer un déclenchement immédiat
sudo systemctl start mon-job.service
  • Un timer systemd = un fichier .timer + un fichier .service (même nom par convention)
  • OnCalendar déclenche à un moment précis, les timers monotones (OnBootSec, OnUnitActiveSec) après un délai
  • Persistent=true rattrape les exécutions manquées — activez-le systématiquement pour les tâches de maintenance
  • systemd-analyze calendar vérifie la syntaxe avant de déployer
  • Les timers offrent la journalisation (journalctl), le sandboxing et les dépendances — absents de cron
  • Les timers utilisateur se placent dans ~/.config/systemd/user/ et nécessitent loginctl enable-linger
  • cron et les timers coexistent — choisissez selon la complexité et les besoins de journalisation

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn