Aller au contenu

Écrire une expression cron sans se tromper.

Cinq nombres séparés par des espaces, une syntaxe de 1975, et quelques pièges qui coûtent cher. Voici tout ce qu'il faut savoir — et un endroit pour vérifier.

⚠ Le piège que presque personne ne connaît

Jour du mois et jour de semaine : c'est un OU, pas un ET

Si tu remplis les deux champs, cron ne fait pas l'intersection. Il déclenche dès que l'un des deux correspond. C'est contraire à l'intuition, ce n'est écrit nulle part clairement, et ça produit des tâches qui tournent bien plus souvent que prévu.

On écrit0 2 20 * 1
On croit avoir écritLe 20 du mois, si c'est un lundi
Ce que ça veut vraiment direLe 20 de chaque mois, ou tous les lundis à 02:00
Donc concrètement09 Nov 02:00 · 16 Nov 02:00 · 20 Nov 02:00
Que faire
  1. Ne remplis qu'un seul des deux champs. Mets * dans l'autre.
  2. Pour « le 20 seulement s'il est lundi », cron ne sait pas le faire : teste le jour dans ton code et sors immédiatement si ce n'est pas le bon.
  3. Dans le doute, colle ton expression dans l'analyseur : il te donne la phrase en français et les vraies dates.

Les autres pièges

Le 31 du mois

0 2 31 * * ne tourne pas en février, avril, juin, septembre ni novembre : ces mois n'ont pas de 31. Cinq mois sans exécution par an, et rien ne le signale.

La nuit du changement d'heure

Au printemps, 02:00 n'existe pas : la tâche est sautée. À l'automne, 02:00 existe deux fois. Programme à 04:00, ou travaille en UTC.

Le 29 février

0 2 29 2 * ne tourne qu'une année sur quatre. C'est rarement ce qu'on voulait.

Dimanche, 0 ou 7 ?

Les deux. 0 et 7 désignent dimanche, et la semaine commence le dimanche — pas le lundi comme en France.

La règle à retenir

Une expression cron ne prévient jamais quand elle ne se déclenche pas. Une tâche qui ne part pas ne produit aucune erreur, aucun journal, aucune alerte — juste un travail qui n'a pas eu lieu. C'est exactement pour ça que LeTock existe.