Automatisation des tâches répétitives avec les tâches Cron
Vous avez écrit un script qui nettoie les anciens journaux, sauvegarde une base de données ou précharge un cache. Il fonctionne parfaitement lorsque vous l’exécutez manuellement. Maintenant, vous avez besoin qu’il s’exécute chaque nuit à 2 heures du matin sans votre intervention. C’est là que cron devient essentiel.
Cron reste l’outil standard pour planifier des scripts sur les systèmes Linux modernes. Comprendre son fonctionnement — et quand utiliser des alternatives — vous évitera des échecs silencieux et des problèmes de débogage.
Points clés à retenir
- Cron est un planificateur de tâches basé sur le temps, intégré aux systèmes de type Unix, qui exécute des commandes à des intervalles spécifiés en utilisant une syntaxe à cinq champs
- Utilisez toujours des chemins absolus dans les tâches cron, car cron s’exécute avec un environnement minimal qui n’inclut pas vos paramètres PATH personnalisés
- Ajoutez de la journalisation, empêchez le chevauchement des tâches avec flock et tenez compte des problèmes de fuseau horaire pour éviter les échecs silencieux
- Pour les environnements conteneurisés ou cloud-native, envisagez les CronJobs Kubernetes, AWS EventBridge ou les planificateurs au niveau applicatif plutôt que le cron traditionnel
Qu’est-ce que Cron et comment fonctionne-t-il ?
Cron est un planificateur de tâches basé sur le temps, intégré aux systèmes de type Unix. Un démon en arrière-plan lit les fichiers de configuration (crontabs) et exécute les commandes aux intervalles spécifiés.
Il existe deux types de crontabs :
- Crontabs utilisateur : Chaque utilisateur maintient son propre planning via
crontab -e - Crontabs système : Situés dans
/etc/crontabet/etc/cron.d/, ils incluent un champ nom d’utilisateur et gèrent les tâches à l’échelle du système
Le démon cron vérifie ces fichiers chaque minute et exécute toutes les tâches dont le planning correspond à l’heure actuelle.
Comprendre la syntaxe Cron
Chaque tâche cron suit une spécification temporelle à cinq champs :
┌───────────── minute (0-59)
│ ┌───────────── heure (0-23)
│ │ ┌───────────── jour du mois (1-31)
│ │ │ ┌───────────── mois (1-12)
│ │ │ │ ┌───────────── jour de la semaine (0-6, dimanche=0)
│ │ │ │ │
* * * * * /path/to/command
Exemples pratiques :
# Exécuter le script de sauvegarde chaque nuit à 2 heures
0 2 * * * /home/deploy/scripts/backup.sh
# Nettoyer les fichiers temporaires chaque dimanche à 3 heures
0 3 * * 0 /usr/bin/find /tmp -type f -mtime +7 -delete
# Toutes les 15 minutes pendant les heures de bureau, jours ouvrables uniquement
*/15 9-17 * * 1-5 /home/deploy/scripts/health-check.sh
Utilisez crontab.guru pour valider les expressions avant de les déployer.
Bonnes pratiques essentielles pour l’automatisation des tâches avec Cron
Utiliser des chemins absolus
Cron s’exécute avec un environnement minimal. Votre PATH n’inclura probablement pas /usr/local/bin ou des répertoires personnalisés. Spécifiez toujours les chemins complets :
# Incorrect - peut échouer silencieusement
0 2 * * * backup.sh
# Correct
0 2 * * * /home/deploy/scripts/backup.sh
Comprendre l’environnement limité de Cron
Cron ne charge pas votre .bashrc ou .profile. Les gestionnaires de versions comme nvm, rbenv ou pyenv ne seront pas disponibles. Soit vous les sourcez explicitement, soit vous utilisez des chemins absolus vers des binaires spécifiques.
Ajouter journalisation et alertes
Sans redirection de sortie, les échecs de cron passent inaperçus :
0 2 * * * /home/deploy/scripts/backup.sh >> /var/log/backup.log 2>&1
Pour les tâches critiques, intégrez des services de surveillance comme Healthchecks.io ou Cronitor.
Empêcher le chevauchement des tâches
Les tâches de longue durée peuvent encore être en cours d’exécution lorsque la prochaine exécution planifiée démarre. Utilisez flock pour empêcher le chevauchement :
0 * * * * /usr/bin/flock -n /tmp/report.lock /home/deploy/scripts/generate-report.sh
Discover how at OpenReplay.com.
Appliquer le principe du moindre privilège
N’exécutez pas tout en tant que root. Créez des comptes de service dédiés pour des tâches spécifiques et utilisez les crontabs utilisateur plutôt que les configurations à l’échelle du système.
Attention aux problèmes de fuseau horaire et d’heure d’été
Cron utilise l’heure système. Les transitions d’heure d’été peuvent entraîner l’exécution double des tâches ou leur omission complète. Pour une planification critique, envisagez d’utiliser UTC.
Cron vs Timers Systemd pour l’automatisation
Sur les distributions basées sur systemd, les timers offrent des avantages qui méritent d’être considérés :
| Fonctionnalité | Cron | Timers Systemd |
|---|---|---|
| Journalisation | Configuration manuelle | Journald intégré |
| Exécutions manquées | Ignorées | Peuvent être rattrapées |
| Dépendances | Aucune | Intégration systemd complète |
| Limites de ressources | Manuelles | Cgroups intégrés |
Pour une automatisation simple au niveau de l’hôte sur une VM, cron fonctionne bien. Lorsque vous avez besoin de gestion des dépendances ou d’une meilleure observabilité, les timers systemd valent la configuration supplémentaire.
Tâches Cron dans les environnements conteneurisés et cloud-native
Le cron traditionnel ne s’intègre pas facilement dans les conteneurs. Exécuter un démon cron aux côtés de votre application viole le principe d’un seul processus par conteneur.
Meilleures alternatives :
- CronJobs Kubernetes : Planification native pour les charges de travail conteneurisées avec logique de nouvelle tentative intégrée
- AWS EventBridge ou GCP Cloud Scheduler : Déclenchent des fonctions Lambda ou des services Cloud Run selon des plannings
- Planificateurs au niveau applicatif : Des outils comme node-cron pour les applications Node.js
Pour les développeurs web, cron sur une petite VM peut toujours déclencher des scripts de maintenance, générer des rapports périodiques ou précharger des caches — même lorsque votre application principale s’exécute ailleurs.
Conclusion
Cron excelle dans l’automatisation simple au niveau de l’hôte : scripts de sauvegarde, rotation des journaux, vérifications de renouvellement de certificats et nettoyages périodiques. Il est léger, universellement disponible et ne nécessite aucune infrastructure supplémentaire.
Choisissez des alternatives lorsque vous avez besoin de planification distribuée, d’orchestration de conteneurs ou de gestion sophistiquée des échecs. Les concepts restent les mêmes — les planificateurs modernes ont emprunté la syntaxe de cron pour de bonnes raisons.
Commencez par une seule tâche bien testée, ajoutez une journalisation appropriée et construisez à partir de là.
FAQ
Cron s'exécute avec un environnement minimal qui ne charge pas vos fichiers de configuration shell comme .bashrc ou .profile. Cela signifie que vos paramètres PATH personnalisés et vos gestionnaires de versions ne sont pas disponibles. Corrigez cela en utilisant des chemins absolus pour toutes les commandes et scripts, ou en sourçant explicitement vos fichiers d'environnement au début de votre commande cron.
Tout d'abord, vérifiez si cron est en cours d'exécution avec systemctl status cron. Ensuite, vérifiez la syntaxe de votre crontab avec crontab -l. Ajoutez de la journalisation en redirigeant la sortie vers un fichier en utilisant >> /chemin/vers/log 2>&1. Consultez les journaux système dans /var/log/syslog ou /var/log/cron pour les messages d'erreur. Assurez-vous également que votre script dispose des permissions d'exécution.
Les crontabs utilisateur sont gérés par utilisateur via crontab -e et exécutent les commandes en tant que cet utilisateur. Les crontabs système dans /etc/crontab et /etc/cron.d/ incluent un champ nom d'utilisateur supplémentaire spécifiant quel utilisateur exécute la commande. Les crontabs système sont généralement utilisés pour les tâches de maintenance à l'échelle du système et nécessitent un accès root pour être modifiés.
Utilisez cron pour des scripts simples et portables qui doivent s'exécuter sur divers systèmes de type Unix. Choisissez les timers systemd lorsque vous avez besoin d'une journalisation intégrée via journald, de la capacité de rattraper les exécutions manquées, de la gestion des dépendances avec d'autres services ou de limites de ressources via cgroups. Les timers systemd nécessitent plus de configuration mais offrent une meilleure observabilité.
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.