Introduction
Les Systemd Timers remplacent avantageusement cron pour les tâches planifiées sous Linux. Ils offrent une meilleure intégration avec le système, une gestion fine des dépendances et des options avancées comme les délais randomisés ou la persistance. Ce tutoriel s'adresse aux administrateurs et développeurs confirmés souhaitant automatiser des processus critiques en production. Vous apprendrez à structurer des unités service et timer complexes tout en évitant les pièges courants.
Prérequis
- Système Linux avec systemd 250+
- Accès root ou sudo
- Connaissances solides des unités systemd
- Éditeur de texte (vim, nano)
- Outil journalctl pour le débogage
Créer le fichier service
[Unit]
Description=Backup base de données PostgreSQL
After=network.target postgresql.service
[Service]
Type=oneshot
User=postgres
ExecStart=/usr/local/bin/backup-script.sh
StandardOutput=journal
StandardError=journalCe fichier définit une tâche oneshot qui s'exécute après le réseau et PostgreSQL. Le type oneshot est obligatoire pour les timers car la tâche n'est pas un daemon persistant.
Créer le timer de base
[Unit]
Description=Timer quotidien pour backup DB
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=45min
[Install]
WantedBy=timers.targetLe timer déclenche le service à 3h du matin. Persistent=true garantit l'exécution manquée après redémarrage. RandomizedDelaySec ajoute un délai aléatoire jusqu'à 45 minutes pour éviter les pics de charge.
Activer et démarrer le timer
sudo systemctl daemon-reload
sudo systemctl enable --now backup-db.timer
sudo systemctl list-timers --alldaemon-reload recharge les unités. enable --now active le timer immédiatement. list-timers affiche l'état et la prochaine exécution planifiée.
Timer avancé avec dépendances
[Unit]
Description=Nettoyage logs hebdomadaire
After=backup-db.timer
[Timer]
OnCalendar=Mon *-*-* 05:30:00
Persistent=true
OnBootSec=15min
AccuracySec=1h
[Install]
WantedBy=timers.targetCe timer s'exécute après le backup et 15 min après le boot. AccuracySec réduit la précision pour économiser les ressources CPU sur les systèmes embarqués.
Script de backup complet
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/var/backups/db"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
pg_dumpall | gzip > "$BACKUP_DIR/full_$DATE.sql.gz"
find "$BACKUP_DIR" -name "*.gz" -mtime +30 -deleteScript idempotent avec gestion stricte des erreurs. Il nettoie automatiquement les backups de plus de 30 jours. Rendre exécutable avec chmod +x.
Bonnes pratiques
- Toujours utiliser Persistent=true pour les tâches critiques
- Limiter RandomizedDelaySec pour éviter les retards excessifs
- Séparer service et timer dans des fichiers distincts
- Tester avec systemctl start --no-block avant mise en production
- Surveiller avec journalctl -u nom.timer
Erreurs courantes à éviter
- Oublier daemon-reload après modification des unités
- Utiliser Type=simple au lieu de oneshot pour les timers
- Ignorer les permissions des scripts (root vs utilisateur)
- Ne pas activer le timer avec enable --now
Pour aller plus loin
Approfondissez la gestion des services avec nos formations Systemd avancées.