Construire une expression cron

construit une expression cron à partir de champs visuels ou d'un préréglage (chaque minute, horaire, quotidien, hebdomadaire...)

Pourquoi un cron builder visuel ?

Une expression cron tient en cinq champs et reste pourtant l'une des plus génératrices de bugs en production. Combien de fois un développeur a écrit 0 0 * * 1 en pensant « tous les lundis », sans se rappeler que 1 peut signifier dimanche selon les implémentations ? Combien de fois a-t-on confondu */15 et 15 ? Le cron builder répond à ce besoin : composer visuellement une crontab expression, à partir de préréglages courants ou de champs individuels, et obtenir l'expression finale prête à coller dans un crontab Linux, un Kubernetes CronJob ou un schedule GitHub Actions.

L'outil est l'inverse de notre cron decoder : là où le converter prend une expression et déroule les prochaines exécutions, le builder prend des choix humains et produit l'expression cron correspondante.

Comment ça marche

L'interface graphique propose deux modes de composition complémentaires :

  • Mode préréglage : un sélecteur de fréquence (every minute, every hour, every day, every week, every month, every year, custom) qui génère immédiatement une cron expression valide.
  • Mode champs : cinq champs éditables (minute, heure, jour du mois, mois, jour de la semaine) où vous saisissez librement *, un entier, une plage 1-5, une liste 1,15,30 ou un pas */15.

Le builder met à jour l'expression en temps réel et affiche une lecture humaine succincte (« tous les jours à 3h », « toutes les 15 minutes ») qui sert de garde-fou : si la phrase ne colle pas avec votre intention, l'expression est probablement fausse.

Les cinq champs cron, en clair

Une expression cron standard contient cinq champs séparés par des espaces :

minute  heure  jour-du-mois  mois  jour-de-la-semaine
*       *      *             *     *
  • minute (0 à 59) ;
  • heure (0 à 23) ;
  • jour du mois (1 à 31) ;
  • mois (1 à 12 ou abréviations Jan, Feb, etc.) ;
  • jour de la semaine (0 à 7, 0 et 7 valant tous deux dimanche dans la plupart des implémentations).

Chaque champ accepte plusieurs formes : * (toutes les valeurs), un entier précis (5), une liste (1,3,5), une plage (9-17), un pas (*/15 toutes les 15 valeurs), ou une combinaison (0-30/5).

Cas d'usage typiques

  • Développeur qui apprend cron : visualiser comment chaque champ interagit, sans risquer une expression fausse en production.
  • Sysadmin pressé : générer en quelques secondes un schedule pour un cron Linux, un Kubernetes CronJob ou un job Ansible sans relire la man page.
  • Développeur sans expérience POSIX : produire une crontab expression valide pour Symfony Scheduler, Laravel Scheduler ou node-cron sans connaître la syntaxe historique.
  • DevOps en revue : prototyper rapidement une expression à proposer dans une pull request, puis la valider avec le cron decoder.
  • Migration legacy : reformuler une expression cron historique en passant par le builder pour s'assurer de la sémantique avant de la pousser ailleurs.

Préréglages courants

Sélectionner un préréglage écrase les champs individuels et produit l'expression correspondante :

  • Toutes les minutes : * * * * *. À éviter en production sauf besoin particulier.
  • Toutes les heures : 0 * * * *. À chaque début d'heure.
  • Tous les jours : 0 0 * * *. À minuit.
  • Toutes les semaines : 0 0 * * 0. Tous les dimanches à minuit.
  • Tous les mois : 0 0 1 * *. Le 1er du mois à minuit.
  • Tous les ans : 0 0 1 1 *. Le 1er janvier à minuit.

Patterns courants à connaître

Expression Lecture humaine
0 0 * * * Tous les jours à minuit
*/15 * * * * Toutes les 15 minutes
0 9 * * 1-5 Tous les jours ouvrés à 9h
0 0 1 * * Le 1er du mois à minuit
0 0 * * 0 Tous les dimanches à minuit
*/5 9-17 * * 1-5 Toutes les 5 minutes en heures ouvrées
0 3 * * * Tous les jours à 3h du matin
30 2 1,15 * * Le 1er et le 15 du mois à 2h30

Composer une expression personnalisée

Pour des cas plus spécifiques, l'assistant expose les cinq champs en saisie libre. Quelques exemples utiles :

  • Tous les jours à 3h du matin : minute=0, heure=3, autres champs *.
  • Toutes les 15 minutes : minute=*/15, autres champs *.
  • Du lundi au vendredi à 9h : minute=0, heure=9, jour-de-la-semaine=1-5.
  • Tous les 1er et 15 du mois à midi : minute=0, heure=12, jour-du-mois=1,15.
  • Toutes les 5 minutes entre 9h et 17h : minute=*/5, heure=9-17.

Comment utiliser le cron builder

  1. Choisissez un préréglage (every minute, every hour, every day, every week, every month, every year) qui correspond à la base de votre besoin.
  2. Affinez si nécessaire en éditant directement les cinq champs (minute, heure, jour du mois, mois, jour de la semaine).
  3. Lisez la phrase humaine générée par l'outil pour confirmer l'intention.
  4. Copiez l'expression cron produite via le bouton de copie.
  5. Validez le schedule avec notre cron decoder qui calcule les prochaines dates d'exécution réelles.
  6. Collez l'expression dans votre crontab Linux, votre Kubernetes CronJob, votre Symfony Scheduler ou votre workflow GitHub Actions.

Pièges classiques

  • Jour du mois et jour de la semaine combinés : si les deux ne sont pas *, le comportement diffère selon les implémentations. Linux/Vixie cron applique un OU ; les librairies modernes ont parfois un comportement différent. À éviter.
  • Jour 1 = lundi ou dimanche ? : selon le pays et la convention. La plupart des cron Unix considèrent dimanche=0 et samedi=6. Vérifiez votre planificateur.
  • Fuseau horaire : un cron Unix utilise par défaut le fuseau du serveur. Les planificateurs applicatifs (Symfony Scheduler, Quartz) permettent souvent de fixer un fuseau dédié.
  • Minute manquante : * * * * * exécute le job toutes les minutes, ce qui n'est rarement ce que l'on veut. Pensez à fixer un déclencheur précis (0) pour des tâches horaires.

Lecture humaine et sortie

En plus de l'expression cron, l'outil propose une lecture humaine succincte (« tous les jours à minuit », « toutes les 5 minutes »). C'est un garde-fou : si la phrase ne correspond pas à votre intention, l'expression est probablement fausse. Pour un cas complexe, utilisez ensuite notre cron decoder pour calculer les prochaines dates d'exécution réelles.

Questions fréquentes

Puis-je éditer manuellement l'expression après usage de l'interface ?

Oui. Le builder n'est pas un mode exclusif : les cinq champs restent éditables à tout moment. Vous pouvez partir d'un préréglage, puis ajuster un champ à la main pour obtenir une crontab expression sur mesure. La lecture humaine est recalculée immédiatement.

L'outil supporte-t-il le format Quartz à 6 champs (avec secondes) ?

Non : le format à 5 champs est le standard Unix et la base commune à la plupart des planificateurs (Linux crontab, Kubernetes CronJob, GitHub Actions, GitLab CI, Symfony Scheduler, Laravel Scheduler). Quartz (Java) accepte un champ supplémentaire pour les secondes et des symboles spécifiques (?, L, W, #), mais ce besoin reste rare.

Comment est géré le fuseau horaire ?

Le builder produit une expression cron neutre : c'est le moteur qui exécute le job qui applique son fuseau horaire. Sur un crontab Linux, c'est la TZ du serveur. Sur GitHub Actions, c'est UTC. Sur Kubernetes 1.27+, vous pouvez fixer spec.timeZone dans le manifest. Symfony Scheduler et Quartz exposent un fuseau dédié par tâche.

Comment valider mon expression sans l'exécuter en production ?

Utilisez notre cron decoder. Il calcule les N prochaines exécutions à partir de l'instant courant, sans démarrer aucun job. C'est le meilleur moyen de confirmer qu'une cron expression tire bien à l'heure prévue avant de la déployer.

Quel est le rapport avec Symfony Scheduler ?

Symfony Scheduler accepte les expressions cron à 5 champs via Schedule::cron('0 3 * * *', ...) . L'expression produite par le builder peut donc être collée telle quelle. Idem pour Laravel Scheduler (->cron('...')), node-cron, Hangfire et Airflow.

Faut-il préfixer la commande dans le crontab système ?

Oui, dans /etc/crontab il faut un utilisateur (0 3 * * * www-data /usr/bin/php ...), tandis que crontab -e par utilisateur l'omet. L'expression elle-même reste identique.

Exemple de requête

curl -X POST https://cdrn.fr/api/v1/tools/cron-builder/execute \
  -H "Content-Type: application/json" \
  -d '{"preset":"none","minute":"*","hour":"*","day_of_month":"*","month":"*","day_of_week":"*"}'

Schéma d'entrée

Champ Type Requis Défaut
preset choice (none, every_minute, hourly, daily, weekly, monthly, yearly) none
minute string *
hour string *
day_of_month string *
month string *
day_of_week string *

Points d'accès

  • GET https://cdrn.fr/api/v1/tools - liste tous les outils disponibles
  • GET https://cdrn.fr/api/v1/tools/cron-builder - récupère le schéma de cet outil
  • POST https://cdrn.fr/api/v1/tools/cron-builder/execute - exécute cet outil avec un payload JSON