03 / GUIDES
Écrire des expressions cron qui ne déclenchent pas de surprises
Les cinq champs et leurs plages, noms contre nombres, le piège OU jour-du-mois et jour-de-semaine, dimanche en 0 ou 7, trous et chevauchements de l'heure d'été, et la validation avec un aperçu des prochaines exécutions avant déploiement.
Cinq champs, lus de gauche à droite
Une expression cron classique compte cinq champs séparés par des espaces : minute (0–59), heure (0–23), jour du mois (1–31), mois (1–12) et jour de la semaine (0–7). Chaque champ accepte une valeur unique, une liste séparée par des virgules, une plage avec tiret, un pas après une barre oblique, ou un astérisque pour chaque valeur.
La plupart des bugs cron ne sont pas de la syntaxe exotique mais un champ ordinaire lu négligemment : un pas qui repart à zéro à la borne de la plage, ou un champ heure écrit pour une horloge de douze heures dans un système qui compte jusqu'à vingt-trois.
- ListesLes listes choisissent des valeurs discrètes : 0,30 dans le champ minute se déclenche à l'heure pile et à la demie.
- Plages et pasLes plages choisissent un intervalle : 9-17 dans le champ heure couvre les heures de bureau, et un pas l'éclaircit — 9-17/2 se déclenche toutes les deux heures dans l'intervalle.
- L'astérisque matche toutL'astérisque ne signifie pas « ignorer ce champ » ; il matche activement chaque valeur, ce qui devient important dès que deux champs de jour interagissent.
Les noms sont des nombres mieux documentés
Les champs mois et jour de semaine acceptent des noms anglais de trois lettres — JAN à DEC et SUN à SAT — comme alias de leurs nombres. 0 9 * JAN MON et 0 9 * 1 1 décrivent la même planification, mais la version nommée s'explique d'elle-même au prochain lecteur et résiste aux erreurs de décalage.
- Insensible à la casseLes noms s'analysent sans tenir compte de la casse — mon, Mon et MON fonctionnent — mais les majuscules sont la convention qui se lit comme intentionnelle.
- Noms dans les plagesLes noms fonctionnent aussi dans les plages et les listes : MON-FRI est l'intervalle standard des jours ouvrés, et JAN,APR,JUL,OCT choisit les mois trimestriels.
- Lire l'explicationCron Builder & Explainer normalise l'expression et explique chaque champ séparément — « mois : chaque valeur », « jour de semaine : 1, 2, 3, 4, 5 » — pour que vous confirmiez que l'analyseur a lu les noms comme vous les pensiez.
Comment les deux champs de jour interagissent
Cet outil suit les règles de jour de type Vixie : si aucun des deux champs de jour ne commence par *, une correspondance dans l'un suffit. 0 9 13 * FRI signifie chaque 13 du mois et chaque vendredi, pas seulement le vendredi 13.
La sortie de l'expliqueur est explicite là-dessus : elle rapporte la sémantique comme dom-dow-or à côté des exécutions calculées, pour qu'une expression qui se déclenchera bien plus souvent que prévu montre son jeu avant d'atteindre une crontab.
- Les pas avec * restent contraignantsSi un champ de jour commence par *, y compris avec un pas comme */2, cet outil exige que les deux champs de jour correspondent ; la restriction du pas reste active.
- Sans * initial, c’est OUSi aucun champ de jour ne commence par *, l'outil applique OU : le jour du mois ou le jour de la semaine peut correspondre.
- ET demande une astucePour viser un vrai vendredi 13, laissez cron choisir le 13 et faites vérifier le jour de la semaine par la commande elle-même — ou utilisez un planificateur à sémantique ET, ce que le cron classique n'est pas.
Dimanche est 0, et généralement aussi 7
Le champ jour de la semaine numérote dimanche 0, lundi 1, et ainsi de suite jusqu'à samedi 6. La plupart des implémentations acceptent aussi 7 comme second dimanche pour ceux qui comptent depuis lundi — l'analyseur Toolars normalise 7 en 0 en interne — mais certains systèmes n'acceptent que l'un des deux, et une numérotation style ISO commençant lundi à 1 existe ailleurs.
- 0 et 70 et 7 sont tous deux dimanche là où 7 est accepté ; écrire 0 est le choix portable d'un planificateur à l'autre.
- Décalage silencieuxUn jour de semaine 7 sur un système qui le refuse échoue bruyamment au déploiement, mais un jour de semaine mal lu comme « septième jour en comptant depuis lundi » échoue silencieusement le mauvais jour.
- Reconfirmer par plateformeQuand une expression voyage entre implémentations — crontab système, plateforme de conteneurs, planificateur CI — reconfirmez la numérotation des jours au lieu de présumer qu'elle a survécu au voyage.
L'heure d'été plie la planification
Les changements d'heure créent des minutes locales absentes ou répétées. Cet aperçu saute un 02:30 inexistant au printemps et liste deux fois une minute correspondante répétée en automne. Un vrai planificateur peut rattraper ou éviter un doublon : vérifiez sa politique.
- L'heure manquanteAu printemps, l'aperçu ne trouve pas de minute locale 02:30 ; certains planificateurs exécutent ensuite les tâches manquées.
- L'heure doubléeEn automne, l'aperçu peut afficher les deux instants correspondants, tandis qu'un vrai planificateur peut supprimer la seconde exécution.
- UTC n'a pas d'heure d'étéLa sortie propre est UTC : pas de changement d'heure, donc 30 2 * * * signifie le même instant chaque jour de l'année. L'expliqueur propose UTC, le fuseau local de l'appareil et des fuseaux nommés comme America/New_York et Europe/London.
Validez avec les prochaines exécutions, pas avec l'espoir
La différence entre une expression correcte et une expression d'apparence plausible est une liste d'heures de déclenchement concrètes. Cron Builder & Explainer calcule les dix prochaines exécutions à partir de maintenant dans le fuseau choisi, en cherchant jusqu'à 366 jours en avant, et évalue dans un worker d'arrière-plan pour qu'une expression lourde ne puisse pas bloquer l'onglet.
- Lire les exécutionsLisez les premières exécutions contre l'intention : « les jours ouvrés à 09:00 » doit montrer du lundi au vendredi à neuf heures, et un samedi dans la liste est le piège OU qui s'annonce.
- Franchir une transitionChoisissez un fuseau nommé et inspectez les prochaines exécutions si le prochain changement d'heure se trouve dans l'aperçu de 366 jours. Le calcul part de maintenant : on ne peut pas choisir une date de départ.
- Erreurs explicitesLes expressions invalides produisent une erreur. Aucune correspondance en 366 jours donne une erreur de limite de recherche ; une à neuf correspondances donnent un résultat partiel.
Planifications et motifs partagent une discipline.
Ce sont de minuscules chaînes au rayon de destruction démesuré — apprenez la boucle écrire-tester-refactorer des expressions régulières, exécutée dans un worker local avec timeout.