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 tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn