Back

Automatisation des tâches répétitives avec les tâches Cron

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/crontab et /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

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éCronTimers Systemd
JournalisationConfiguration manuelleJournald intégré
Exécutions manquéesIgnoréesPeuvent être rattrapées
DépendancesAucuneIntégration systemd complète
Limites de ressourcesManuellesCgroups 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.

OpenReplay