Erreurs Courantes des Expressions Cron à Éviter
Découvrez les erreurs les plus courantes des expressions cron et comment les corriger. Évitez ces pièges lors de la planification des tâches avec cron.
Having trouble? Try the tool
Test your with our interactive tool
Top 10 Common Mistakes
Utiliser des Chemins Relatifs au Lieu de Chemins Absolus
Symptoms
- • Les commandes échouent avec des erreurs "command not found"
- • Les scripts s'exécutent manuellement mais échouent dans cron
- • Échecs intermittents selon le répertoire actuel
Root Cause
Les tâches cron s'exécutent dans un environnement minimal avec un répertoire de travail imprévisible (souvent le répertoire personnel de l'utilisateur ou /root). Les chemins relatifs dépendent du répertoire actuel, ce qui n'est pas garanti dans le contexte cron.
Solution
Utilisez toujours des chemins absolus pour toutes les commandes, scripts et références de fichiers. Définissez explicitement le répertoire de travail avec `cd` si nécessaire.
❌ Wrong
# Faux - utilise des chemins relatifs
*/5 * * * * python script.py
*/5 * * * * ./scripts/backup.sh
✅ Correct
# Correct - utilise des chemins absolus
*/5 * * * * /usr/bin/python3 /opt/scripts/script.py
*/5 * * * * cd /opt/scripts && ./backup.sh
*/5 * * * * /opt/scripts/backup.sh
Ignorer les Variables d'Environnement
Symptoms
- • Les scripts fonctionnent dans le shell mais échouent dans cron
- • Commandes non trouvées alors qu'elles sont dans PATH lors de l'exécution manuelle
- • Les applications échouent en raison d'une configuration d'environnement manquante
Root Cause
Cron s'exécute avec un environnement sévèrement limité - généralement seulement HOME, LOGNAME, SHELL et un PATH minimal (/usr/bin:/bin). Les variables d'environnement de votre profil shell (.bashrc, .zshrc) ne sont pas chargées.
Solution
Définissez explicitement les variables d'environnement requises dans la crontab ou le script. Définissez PATH et toutes les variables spécifiques à l'application.
❌ Wrong
# Faux - suppose l'environnement shell
*/5 * * * * python script.py
*/5 * * * * ./data_process.sh
✅ Correct
# Correct - environnement explicite
PATH=/usr/local/bin:/usr/bin:/bin
NODE_ENV=production
DB_HOST=localhost
*/5 * * * * /usr/bin/python3 /opt/scripts/script.py
*/5 * * * * /opt/scripts/data_process.sh
Oublier de Rediriger la Sortie et les Erreurs
Symptoms
- • Aucun moyen de déboguer les tâches cron échouées
- • La sortie est envoyée par e-mail système (souvent jamais lue)
- • L'espace disque se remplit de sortie non journalisée
Root Cause
Par défaut, cron envoie toute sortie au propriétaire de la tâche par e-mail. Sans redirection explicite, les erreurs et les logs sont perdus dans les e-mails ou le vide.
Solution
Redirigez toujours stdout et stderr vers des fichiers日志. Utilisez `>>` pour ajouter et `2>&1` pour rediriger les deux flux.
❌ Wrong
# Faux - la sortie va aux e-mails ou est perdue
*/5 * * * * /opt/scripts/check.sh
✅ Correct
# Correct - la sortie est journalisée dans un fichier
*/5 * * * * /opt/scripts/check.sh >> /var/log/check.log 2>&1
*/5 * * * * /opt/scripts/check.sh 1>> /var/log/check.out.log 2>> /var/log/check.err.log
Utiliser à la Fois le Jour du Mois et le Jour de la Semaine
Symptoms
- • Les tâches s'exécutent plus fréquemment que prévu
- • Les tâches s'exécutent à des jours inattendus
- • Confusion sur le moment d'exécution des tâches
Root Cause
Dans cron standard, si le jour du mois (1-31) ET le jour de la semaine (0-6) sont tous deux restreints (non *), la tâche s'exécute lorsque l'un ou l'autre des champs correspond. C'est une source courante de confusion.
Solution
Utilisez `?` ou `*` pour l'un des champs lorsque vous voulez restreindre l'autre. Si vous avez besoin du "15 et seulement si c'est un lundi", implémentez la logique dans le script lui-même.
❌ Wrong
# Faux - s'exécute le 15 de chaque mois OU chaque vendredi
0 0 15 * 5 /script.sh # S'exécute le 15 de chaque mois ET chaque vendredi
✅ Correct
# Correct - ne s'exécute que le vendredi 15 (logique dans le script)
0 0 * * 5 /scripts/check_friday_15th.sh # Le script vérifie si c'est le 15
# OU utilisez cron moderne avec ? pour le champ non restrictif
0 0 15 * ? /scripts/monthly.sh # S'exécute le 15, jour de la semaine ignoré
0 0 ? * 5 /scripts/weekly.sh # S'exécute chaque vendredi, jour ignoré
Absence de Permissions d'Exécution sur les Scripts
Symptoms
- • La tâche cron échoue avec "Permission denied"
- • La tâche est planifiée mais ne s'exécute jamais
- • Pas de message d'erreur ou erreur cryptique dans les日志
Root Cause
Les scripts doivent avoir des permissions d'exécution (+x) pour être exécutés directement. Sans permissions d'exécution, le script ne peut pas être invoqué par cron.
Solution
Définissez toujours les permissions d'exécution sur les scripts avec `chmod +x`. Alternativement, appelez le script explicitement avec l'interpréteur (ex: `bash script.sh`).
❌ Wrong
# Faux - le script n'est peut-être pas exécutable
*/5 * * * * /opt/scripts/myscript.sh
✅ Correct
# Options correctes :
# 1. Rendre le script exécutable
$ chmod +x /opt/scripts/myscript.sh
*/5 * * * * /opt/scripts/myscript.sh
# 2. Appeler avec l'interpréteur
*/5 * * * * /bin/bash /opt/scripts/myscript.sh
# 3. Ajouter shebang et rendre exécutable
#!/bin/bash
# contenu du script
Gestion Incorrecte du Fuseau Horaire
Symptoms
- • Les tâches s'exécutent au mauvais moment
- • Les tâches s'exécutent une heure trop tôt ou trop tard
- • Comportement incohérent entre les systèmes
Root Cause
Cron utilise le fuseau horaire configuré du système. Dans les environnements cloud ou conteneurs, il peut s'agir d'UTC plutôt que de votre fuseau horaire local. Les changements d'heure (heure d'été) peuvent également affecter la planification.
Solution
Définissez explicitement le fuseau horaire dans la crontab avec CRON_TZ, ou utilisez UTC universellement. Documentez le fuseau horaire que votre cron suppose.
❌ Wrong
# Faux - suppose le fuseau horaire système (peut varier)
0 9 * * * /scripts/morning_report.sh # S'exécute à 9h, mais quel fuseau?
✅ Correct
# Correct - fuseau horaire explicite
CRON_TZ=Europe/Paris
0 9 * * * /scripts/morning_report.sh # 9h heure de Paris
# OU utilisez UTC et documentez
# Toutes les heures cron en UTC
0 8 * * * /scripts/morning_report.sh # 9h Paris = 8h UTC
Ne Pas Gérer les Tâches Superposées
Symptoms
- • Plusieurs instances de la même tâche s'exécutent
- • Épuisement des ressources dû aux processus en double
- • Corruption des données due aux écritures simultanées
- • Conditions de course dans les fichiers de sortie
Root Cause
Si une tâche prend plus de temps que son intervalle planifié, cron lancera une autre instance pendant que la première est encore en cours d'exécution. Cela conduit à des exécutions superposées.
Solution
Utilisez des verrous de fichiers (flock) ou des vérifications de processus (pgrep) pour assurer qu'une seule instance s'exécute. Pour les tâches critiques, utilisez systemd ou supervisord avec une gestion appropriée des mutex.
❌ Wrong
# Faux - peut démarrer des superpositions si le script dure >5 min
*/5 * * * * /scripts/data_sync.sh
✅ Correct
# Correct - empêche les superpositions
# Méthode 1: flock
*/5 * * * * /usr/bin/flock -w 0 /tmp/data_sync.lock -c /scripts/data_sync.sh
# Méthode 2: vérification pid dans le script
if [ -f /tmp/myscript.pid ]; then
pid=$(cat /tmp/myscript.pid)
if ps -p $pid > /dev/null; then
echo "Already running"
exit 1
fi
fi
echo $$ > /tmp/myscript.pid
trap "rm -f /tmp/myscript.pid" EXIT
Planifier des Tâches Gourmandes en Ressources Pendant les Heures de Pointe
Symptoms
- • Dégradation des performances du système pendant les heures de travail
- • Plaintes concernant la lenteur des systèmes
- • Les tâches cron concurrencent l'activité des utilisateurs
- • Pic de charge à des moments prévisibles
Root Cause
Les tâches gourmandes en ressources (sauvegardes, traitement par lots, rapports) planifiées pendant les heures d'utilisation maximale concurrencent le CPU, la mémoire et les E/S avec les utilisateurs actifs.
Solution
Planifiez les tâches gourmandes en ressources pendant les heures creuses (tard la nuit, tôt le matin). Surveillez la charge du système et ajustez les planifications en conséquence.
❌ Wrong
# Faux - sauvegarde lourde pendant la journée de travail
0 10 * * * /scripts/heavy_backup.sh # 10h - heures de pointe
0 14 * * * /scripts/data_processing.sh # 14h - aussi très chargé
✅ Correct
# Correct - planification hors pointe
0 2 * * * /scripts/heavy_backup.sh # 2h du matin - activité minimale
0 3 * * 0 /scripts/weekly_report.sh # Dimanche 3h - week-end
0 6 * * 1 /scripts/monthly_cleanup.sh # Lundi 6h - avant le travail
# Vérifier la charge système avant d'exécuter
*/30 * * * * /usr/bin/bash -c '[[ $(cat /proc/loadavg | awk '{print $1}'`) < 2.0 ]] && /scripts/light_task.sh'
Oublier de Tester les Nouvelles Tâches Cron
Symptoms
- • Les tâches échouent silencieusement en production
- • Erreurs de syntaxe découvertes après le déploiement
- • Comportement inattendu dans l'environnement cron
- • Correctifs d'urgence requis à des moments inopportuns
Root Cause
Les expressions cron et les scripts qui fonctionnent dans un environnement de test peuvent échouer en production en raison de différents chemins, variables d'environnement, permissions ou configurations système.
Solution
Testez toujours les tâches cron avant le déploiement en production. Testez le script manuellement, validez la syntaxe de l'expression cron et surveillez les premières exécutions.
❌ Wrong
# Faux - non testé en production
0 0 * * * /scripts/new_feature.sh # Ajouté directement en prod
✅ Correct
# Correct - workflow de test
# 1. Tester le script manuellement
$ /scripts/new_feature.sh
# 2. Valider la syntaxe cron
$ crontab -l | grep new_feature
# ou utiliser un validateur en ligne
# 3. Tester d'abord avec une planification fréquente
*/5 * * * * /scripts/new_feature.sh # Exécuter toutes les 5 min pour tester
# Vérifier: tail -f /var/log/new_feature.log
# 4. Une fois validé, mettre à jour vers la planification cible
0 0 * * * /scripts/new_feature.sh
Ignorer l'État du Service Cron
Symptoms
- • Les tâches cron arrêtent mystérieusement de s'exécuter
- • Pas de日志 ou messages d'erreur
- • Les tâches fonctionnent après redémarrage mais échouent plus tard
- • Planification peu fiable
Root Cause
Le service cron ou crond peut être arrêté, désactivé ou défaillant. Les mises à jour système ou les changements de configuration peuvent arrêter le service sans notification.
Solution
Surveillez l'état du service cron et configurez des alertes. Assurez-vous que le service est activé pour démarrer au démarrage.
❌ Wrong
# Faux - suppose que cron est toujours en cours d'exécution
# Pas de surveillance ou vérification
✅ Correct
# Correct - surveiller le service cron
# Vérifier l'état du service
$ systemctl status cron
$ systemctl status crond
# Activer au démarrage
$ sudo systemctl enable cron
$ sudo systemctl start cron
# Surveiller avec un contrôle de santé
*/15 * * * * /usr/bin/systemctl is-active cron || /usr/bin/systemctl restart cron
# Alerte si cron échoue
*/15 * * * * /usr/bin/systemctl is-active --quiet cron || echo "Cron arrêté!" | mail -s "Alerte" [email protected]