cron debugging linux devops scheduling

Résoudre 'invalid cron expression' et les erreurs de syntaxe Cron courantes

Un guide complet pour corriger les erreurs Cron telles que 'invalid cron expression', 'cron syntax error' et 'cron not running'. Apprenez à rédiger correctement des planifications pour Linux et Quartz.

Résoudre "invalid cron expression" et les erreurs de syntaxe Cron courantes : Guide Complet

Cron est l'outil standard pour planifier des tâches répétitives sur les systèmes d'exploitation de type Unix. Que vous exécutiez une sauvegarde de base de données chaque nuit ou que vous envoyiez une newsletter chaque lundi, Cron est le moteur en coulisses. Cependant, sa syntaxe à "cinq champs" (ou six champs) peut être déroutante, entraînant des erreurs telles que invalid cron expression (expression cron invalide), cron syntax error (erreur de syntaxe cron) ou la plus frustrante de toutes : cron job not running (la tâche cron ne s'exécute pas).

Dans ce guide, nous allons décortiquer la syntaxe Cron et vous montrer comment corriger les erreurs de planification courantes.


1. Messages d'erreur Cron courants

Contrairement à un compilateur, Cron ne vous donne pas toujours un message d'erreur clair. Au lieu de cela, vous pourriez voir :

  • Validation de Crontab : crontab: installing new crontab suivi de errors in crontab file, can't install (erreurs dans le fichier crontab, installation impossible).
  • Journaux système : ORPHAN (no passwd entry) ou CMD (failed to execute).
  • Bibliothèques d'analyse : invalid cron expression, Unexpected end of expression ou Number out of range (nombre hors plage).

2. Causes principales et solutions

2.1 La confusion "5 vs 6 champs"

Le Cron Linux standard (Vixie) utilise 5 champs : Minute Heure Jour Mois Jour-de-la-semaine

Cependant, de nombreuses bibliothèques modernes (comme Quartz en Java ou Node-Cron) et certains systèmes (comme AWS Lambda ou Spring) utilisent 6 champs, en ajoutant les Secondes au début ou l'Année à la fin.

L'erreur : Utiliser une expression à 6 champs dans une crontab Linux standard.

La solution : Vérifiez la documentation de votre environnement. Si vous utilisez crontab -e sur Linux, utilisez 5 champs. Si vous utilisez une bibliothèque spécifique, vérifiez si elle attend les secondes.

2.2 Erreurs de plage et de pas

Cron utilise / pour les pas (ex : */5 pour toutes les 5 unités) et - pour les plages. Une erreur courante consiste à utiliser un nombre en dehors de la plage autorisée.

L'erreur :

  • * * 31 2 * (Tentative d'exécution le 31 février)
  • 60 * * * * (La minute 60 est invalide ; utilisez 0-59)
  • * 24 * * * (L'heure 24 est invalide ; utilisez 0-23)

La solution : Assurez-vous toujours que vos chiffres respectent ces limites :

  • Minutes : 0-59
  • Heures : 0-23
  • Jour du mois : 1-31
  • Mois : 1-12 (ou JAN-DEC)
  • Jour de la semaine : 0-6 (0 est le dimanche, ou SUN-SAT)

2.3 Le piège "Jour du mois" vs "Jour de la semaine"

Dans le Cron standard, si vous spécifiez à la fois un "Jour du mois" et un "Jour de la semaine", la tâche s'exécutera lorsque l'une ou l'autre des conditions est remplie (logique OR), et non les deux (logique AND).

L'erreur : 0 0 1 * 1 (Vous vous attendez à ce qu'elle s'exécute uniquement si le 1er du mois est un lundi, mais elle s'exécutera en réalité tous les 1ers du mois ET tous les lundis).

La solution : Pour obtenir une logique "AND", vous devez utiliser une vérification par commande : 0 0 1 * * [ "$(date +\%u)" = "1" ] && /path/to/command

2.4 Variables d'environnement et chemins

Une raison très courante pour laquelle "cron ne s'exécute pas" est que Cron exécute les commandes dans un environnement très minimal. Votre PATH peut être différent et votre .bashrc n'est pas chargé.

Le symptôme : La commande fonctionne lorsque vous l'exécutez manuellement mais échoue dans Cron.

La solution : Utilisez toujours des chemins absolus pour la commande et pour tous les fichiers qu'elle manipule : /usr/bin/python3 /home/user/script.py >> /home/user/cron.log 2>&1


3. Dépannage avancé

3.1 Signes de pourcentage (%) dans Crontab

Dans un fichier crontab, le signe de pourcentage % a une signification particulière (il représente une nouvelle ligne). Si votre commande contient un % (courant dans les commandes date), vous devez l'échapper avec un backslash \%.

L'erreur : 0 0 * * * tar -cvf backup-$(date +%Y-%m-%d).tar /data

La solution : 0 0 * * * tar -cvf backup-$(date +\%Y-\%m-\%d).tar /data

3.2 Redirection de la sortie

Si une tâche Cron échoue silencieusement, c'est généralement parce que la sortie (stdout/stderr) est envoyée vers un fichier de messagerie local que vous ne consultez jamais. Solution : Redirigez toujours la sortie vers un fichier journal pour voir ce qui n'a pas fonctionné : >> /var/log/matache.log 2>&1.


4. Prévention et bonnes pratiques

  1. Utilisez un analyseur/générateur : Ne devinez pas. Utilisez un outil visuel pour voir exactement quand votre expression s'exécutera.
  2. Commentez vos tâches : Ajoutez toujours un commentaire au-dessus de votre entrée crontab expliquant son rôle.
  3. Utilisez des chemins absolus : Nous ne le soulignerons jamais assez. /usr/local/bin/node au lieu de node.
  4. Testez avec "Toutes les minutes" : Lors de la configuration initiale d'une tâche, réglez-la sur * * * * * pour vérifier qu'elle fonctionne, puis modifiez-la selon la planification réelle.

5. FAQ : Foire aux questions

Q : Est-ce que 0 ou 7 représente le dimanche ?

R : Dans la plupart des implémentations de Cron (comme Linux), 0 et 7 représentent tous deux le dimanche. Cependant, certaines utilisent strictement 0. L'utilisation de SUN est souvent plus claire.

Q : Comment exécuter une tâche toutes les 5 minutes ?

R : Utilisez la syntaxe de pas : */5 * * * *.

Q : Pourquoi ma tâche Cron ne s'est-elle pas exécutée à 2 heures du matin lors du passage à l'heure d'été ?

R : C'est un problème classique. Lorsque l'horloge avance ou recule, les tâches planifiées pendant cette heure peuvent s'exécuter deux fois ou pas du tout. Solution : Évitez de planifier des tâches critiques entre 1h et 3h du matin, ou réglez votre serveur sur l'heure UTC.


6. Outil de vérification rapide

Confus par les astérisques et les barres obliques ? Utilisez notre Analyseur et Visualiseur d'Expressions Cron. Il peut :

  • Traduire instantanément la syntaxe Cron en un langage humain compréhensible.
  • Calculer les 5 prochaines heures d'exécution.
  • Prendre en charge les formats à 5 et 6 champs.
  • Valider votre expression et mettre en évidence les erreurs de syntaxe.

Erreurs liées

  • Résoudre les erreurs 'Unexpected token in JSON'
  • Comment corriger les erreurs 'invalid base64 string'
  • Comprendre les erreurs d'indentation YAML