Planification des tâches sous Linux : comparaison entre cron et systemd timer
Dans la gestion des systèmes Linux, le moment d’exécution d’une tâche est aussi crucial que ce qui est exécuté.
Le compagnon le plus ancien est cron, tandis que la plupart des distributions récentes privilégient systemd timer.
Dans cet article, nous comparons les deux solutions et indiquons dans quelles situations chacune est préférable.
1. Pourquoi comparer cron et systemd timer ?
La plupart des serveurs Linux rencontrent ces besoins :
- Sauvegarde quotidienne à 3 h du matin
- Script de vérification de santé toutes les 5 minutes
- Compression et archivage des logs chaque dimanche
- Initialisation qui doit s’exécuter une seule fois, 1 minute après le démarrage
Traditionnellement, tout était géré par cron. Aujourd’hui, de nombreuses distributions utilisent systemd comme système d’initialisation, ce qui fait de son timer unit une alternative puissante.
2. Concepts de base de cron
2.1 Qu’est‑ce que cron ?
cron est un planificateur Unix/Linux ancien.
Il exécute des commandes selon un horaire défini, et la configuration se fait principalement via le fichier crontab.
2.2 Où se trouve la configuration de cron ?
- Système :
/etc/crontab,/etc/cron.d/ - Utilisateur : édité avec
crontab -e
Par exemple, pour lancer un script de sauvegarde chaque jour à 3 h du matin :
0 3 * * * /usr/local/bin/backup.sh
Les champs signifient :
min hour day month weekday command
0 3 * * * /usr/local/bin/backup.sh
2.3 Avantages de cron
- Outil éprouvé et fiable
- Concept identique sur la plupart des systèmes Unix/Linux
- Syntaxe simple et nombreux exemples
- Fonctionne même sur les systèmes sans systemd
2.4 Limites de cron
- Séparé des services : difficile de savoir à quel service une tâche appartient
- Vérification d’état/logs compliquée (syslog, mail, etc.)
- Gestion des dépendances faible (ex. : service doit être démarré avant)
- Planification relative (« 5 minutes après le démarrage ») peu claire
3. Concepts de base de systemd timer
3.1 Qu’est‑ce que systemd timer ?
systemd timer est l’unit de minuterie de systemd.
Il déclenche un autre unit de service selon des conditions (heure, temps depuis le démarrage, etc.).
En pratique, on travaille toujours en paire :
myjob.service: définit la tâche à exécutermyjob.timer: définit quand la tâche doit être lancée
3.2 Exemple de service + timer
Pour exécuter une sauvegarde chaque jour à 3 h du matin :
(1) Unité de service : /etc/systemd/system/backup.service
[Unit]
Description=Daily backup job
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
(2) Unité de minuterie : /etc/systemd/system/backup.timer
[Unit]
Description=Run daily backup at 3:00
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
Activation :
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
3.3 Avantages de systemd timer
- Lien clair avec le service : on sait exactement quel service est déclenché
- Gestion des logs simplifiée :
journalctl -u backup.service - Conditions de déclenchement flexibles :
OnCalendar=: expression horaire similaire à cronOnBootSec=: X secondes après le démarrageOnUnitActiveSec=/OnUnitInactiveSec=: X secondes après la dernière exécution- Gestion des dépendances :
After=network-online.target,Requires=… - Intégration avec l’écosystème systemd :
systemctl list-timers,systemctl status
3.4 Inconvénients de systemd timer
- Courbe d’apprentissage plus élevée (service + timer)
- Dépendance à systemd : pas utilisable sur les systèmes très anciens ou non‑systemd
- Pour une tâche simple d’une seule ligne, peut sembler excessif
4. Comparaison fonctionnelle
4.1 Tableau comparatif
| Élément | cron | systemd timer |
|---|---|---|
| Emplacement de configuration | /etc/crontab, crontab -e |
/etc/systemd/system/*.service/*.timer |
| Cible d’exécution | Commande ou script arbitraire | Service systemd |
| Syntaxe horaire | Expression cron (5 champs) | OnCalendar, OnBootSec, etc. |
| Délai après démarrage | Limité, nécessite un script | OnBootSec, OnStartupSec directement supportés |
| Gestion des échecs/re‑essais | À implémenter manuellement | Paramètres du service (Restart=) |
| Consultation des logs | Syslog, mail, etc. | journalctl -u <service> |
| Dépendances (réseau, FS) | Pas de support natif | Options After=, Requires= |
| Intégration système | Faible | Élevée (systemd) |
| Portabilité | Relativement élevée | Dépend de systemd |
5. Illustrations pratiques
5.1 Sauvegarde quotidienne à 3 h : cron vs timer
Version cron
0 3 * * * /usr/local/bin/backup.sh
Version systemd timer
# backup.service
[Unit]
Description=Daily backup job
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# backup.timer
[Unit]
Description=Run daily backup at 3:00
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
5.2 Exécution unique 5 minutes après le démarrage
Avec cron, on recourt souvent à des astuces (@reboot + sleep, rc.local, etc.).
Implémentation systemd timer
# init-job.service
[Unit]
Description=Run custom init job after boot
[Service]
Type=oneshot
ExecStart=/usr/local/bin/init-job.sh
# init-job.timer
[Unit]
Description=Run init job 5 minutes after boot
[Timer]
OnBootSec=5min
AccuracySec=1min
[Install]
WantedBy=timers.target
Ainsi, 5 minutes après le démarrage, init-job.service s’exécute une seule fois.
6. Quand choisir quoi ?
6.1 Quand rester avec cron
- Vous avez déjà de nombreuses tâches cron fonctionnelles
- Vous n’avez pas besoin d’une intégration poussée avec systemd
- Vous gérez un petit serveur avec seulement quelques tâches récurrentes
- Vous devez supporter des environnements non‑systemd (certaines conteneurs, BSD, très anciens OS)
6.2 Quand opter pour systemd timer
- Vos services sont déjà gérés par systemd
- Vous souhaitez centraliser logs et état via
journalctl - Vous avez besoin de déclencheurs relatifs (« 5 minutes après le démarrage », « X minutes après la dernière exécution »)
- Vous avez des dépendances complexes (ex. : démarrer après le réseau ou un service spécifique)
- Vous travaillez dans un pipeline CI/CD ou un environnement de production où l’observabilité est cruciale
7. Conseils pour migrer des tâches cron vers systemd timer
- Lister les tâches cron actuelles
*
crontab -l* Vérifier/etc/crontabet/etc/cron.d/* - Décomposer chaque tâche en service + timer * Service : ce qui doit être exécuté * Timer : quand l’exécuter
- Convertir la syntaxe horaire
*
0 3 * * *→OnCalendar=*-*-* 03:00:00**/5 * * * *→OnCalendar=*:0/5 - Tester
*
systemctl start myjob.servicepour vérifier le service *systemctl start myjob.timerpuissystemctl list-timerspour confirmer l’horaire - Désactiver le cron original * Une fois le timer stable, commenter ou supprimer la ligne cron correspondante
8. Conclusion : coexistence possible
En résumé :
cronreste un planificateur simple et portablesystemd timeroffre une gestion orientée service, une observabilité accrue et des déclencheurs flexibles
Il n’existe pas de « bonne » réponse unique. Si vous créez de nouvelles tâches ou si elles sont étroitement liées à un service, privilégiez systemd timer. Pour des tâches simples déjà en place, cron peut rester sans problème.

Aucun commentaire.