Calculer les prochaines exécutions d'une expression cron

analyse et affiche les prochaines dates d'exécutions de la configuration cron

Qu'est-ce qu'une expression cron ?

Une expression cron est une chaîne courte qui décrit une récurrence dans le temps. Le format hérité d'Unix tient en cinq champs séparés par des espaces : minute, heure, jour du mois, mois et jour de la semaine. Cette syntaxe est née avec le démon cron de Brian Kernighan dans les années 1970, puis généralisée par le Vixie cron (1987) repris par toutes les distributions Linux et macOS modernes. Aujourd'hui, la même syntaxe se retrouve dans la majorité des planificateurs cloud (AWS EventBridge, GCP Cloud Scheduler, Azure Logic Apps) et CI/CD (GitHub Actions, GitLab CI, Jenkins).

┌──── minute (0-59)
│ ┌── heure (0-23)
│ │ ┌── jour du mois (1-31)
│ │ │ ┌── mois (1-12 ou JAN-DEC)
│ │ │ │ ┌── jour de la semaine (0-7 ou SUN-SAT, 0 et 7 = dimanche)
│ │ │ │ │
* * * * *

Une expression cron bien formée définit donc un cron schedule précis : chaque champ peut être une valeur fixe, une plage, une liste, un pas ou un astérisque qui matche tout. La compacité de la crontab expression est sa force, mais c'est aussi ce qui rend un cron decoder indispensable pour valider visuellement l'intention. C'est tout l'objet de ce cron converter : produire une explication cron lisible, plus la liste des prochaines exécutions.

Anatomie d'une expression cron

Les cinq champs partagent une grammaire commune. Voici les bornes acceptées par chaque colonne d'une expression crontab standard :

  • Minute : 0-59.
  • Heure : 0-23, format 24h.
  • Jour du mois : 1-31.
  • Mois : 1-12 ou les abréviations textuelles JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC.
  • Jour de la semaine : 0-70 et 7 représentent tous deux dimanche, ou les abréviations SUN, MON, TUE, WED, THU, FRI, SAT.

Caractères spéciaux partagés par les cinq champs :

  • * : any value, matche toutes les valeurs autorisées du champ.
  • , : liste discrète, par exemple 1,15,30 dans le champ minute.
  • - : plage inclusive, par exemple 9-17 pour les heures de bureau.
  • / : pas (step), par exemple */15 = toutes les 15 unités, ou 0-30/5 = toutes les 5 minutes entre 0 et 30.

Extensions Quartz (Java, AWS EventBridge, Spring) : la grammaire grimpe à 6 ou 7 champs avec une colonne secondes en tête (0-59) et parfois une colonne année en queue (1970-2099). Quartz introduit aussi ? (no specific value, pour découpler jour-du-mois et jour-de-la-semaine), L (last : dernier jour du mois, ou dernier vendredi avec 5L), W (jour ouvré le plus proche) et # (N-ième jour de la semaine du mois, par exemple 2#3 pour le 3ème lundi). Une expression Quartz n'est en général pas compatible avec un crontab UNIX, et vice versa : c'est la principale source d'erreur quand on copie une cron expression d'une plateforme à l'autre.

# UNIX / Vixie cron (5 champs)
0 9 * * 1-5

# Quartz (6 champs avec secondes)
0 0 9 ? * MON-FRI

# Quartz (7 champs avec année)
0 0 9 ? * MON-FRI 2026

Pourquoi décoder une expression cron ?

Lire 0 0 * * * est rapide. Lire */7 2-5 1,15 * 1-5 l'est nettement moins. Quand une expression sort du trivial, le risque d'erreur d'interprétation grimpe et la cron decode devient une étape de revue à part entière.

  • Debug production : comprendre pourquoi une tâche s'est déclenchée à 03h17 et pas à 03h00, ou identifier un chevauchement entre deux jobs.
  • Code review : valider qu'un planificateur poussé en pull request fait bien ce que l'auteur prétend, sans devoir mémoriser la sémantique de chaque symbole.
  • Audit de planificateurs : passer en revue les cron jobs Linux dans /etc/crontab et /etc/cron.d/, les triggers Jenkins, les spec.schedule de Kubernetes CronJob, les règles AWS EventBridge et les jobs GCP Cloud Scheduler.
  • Migration legacy : reprendre un /etc/crontab historique sans documentation et reconstruire la cartographie des tâches avant un changement d'infrastructure.
  • Onboarding : permettre à un nouveau développeur de relire une crontab sans avoir à apprendre tous les caractères spéciaux du jour au lendemain.

Comment utiliser le cron decoder

La marche à suivre pour décoder une expression crontab avec l'outil :

  1. Collez votre cron expression dans le champ de saisie (5 champs séparés par des espaces).
  2. Indiquez le nombre de prochaines exécutions à calculer.
  3. Cliquez sur convert pour lancer le cron decode : l'outil renvoie une phrase humaine qui explique le déclenchement, plus la liste datée des prochaines exécutions.
  4. Vérifiez visuellement que les dates correspondent à votre intention (heure, jour, fréquence).
  5. Copiez la sortie via le bouton de copie pour la coller dans un ticket, une PR ou une documentation technique.

L'outil ne se contente pas d'un parsing syntaxique : il fournit une explication cron en langage naturel, ce qui en fait à la fois un cron decoder et un valideur de planning.

Exemples classiques de cron expression

Les motifs ci-dessous couvrent l'essentiel des cron schedules rencontrés en production. Ils sont tous valides sur Linux crontab, Kubernetes CronJob, GitHub Actions et la majorité des planificateurs applicatifs.

Expression Lecture humaine
* * * * * Toutes les minutes
0 * * * * Toutes les heures pile
0 0 * * * Tous les jours à minuit
0 0 * * 0 Tous les dimanches à minuit
*/15 * * * * Toutes les 15 minutes
0 9 * * 1-5 9h00 du lundi au vendredi
0 0 1 * * Le 1er de chaque mois à minuit
0 0,12 * * * À minuit et midi tous les jours
*/5 9-17 * * 1-5 Toutes les 5 minutes en heures ouvrées
30 2 1,15 * * Le 1er et le 15 du mois à 2h30

Pour exécuter une tâche cron sur un serveur Linux, on édite la crontab utilisateur depuis le shell :

# éditer la crontab de l'utilisateur courant
$ crontab -e

# lister les tâches existantes
$ crontab -l

# exemple de ligne ajoutée : sauvegarde quotidienne à 3h
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Exemple de sortie du cron converter pour */5 * * * * :

2026-05-05 00:00:00
2026-05-05 00:05:00
2026-05-05 00:10:00
2026-05-05 00:15:00
2026-05-05 00:20:00
...

Questions fréquentes sur le cron decoder

Quelle différence entre cron UNIX et Quartz ?

UNIX/Vixie cron utilise 5 champs (minute à jour-de-la-semaine), sans précision à la seconde, et n'a pas de notion native de « dernier jour du mois ». Quartz (Java, Spring, AWS EventBridge) ajoute une colonne secondes en tête, parfois une colonne année en queue, et plusieurs symboles (?, L, W, #) absents de la crontab Linux. Une expression cron Quartz à 6 champs n'est donc pas directement portable vers /etc/crontab, et inversement. Notre cron decoder cible le format à 5 champs, qui couvre la majorité des planificateurs.

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

Avec le pas / sur le champ minute :

*/5 * * * * /usr/local/bin/check-health.sh

Cette crontab expression déclenche le script aux minutes 0, 5, 10, 15... de chaque heure, tous les jours. Pour limiter aux heures ouvrées du lundi au vendredi, ajoutez les contraintes sur les champs heure et jour-de-la-semaine : */5 9-17 * * 1-5.

Que veut dire l'astérisque (*) dans une expression cron ?

L'astérisque signifie any value : il matche toutes les valeurs autorisées du champ. Dans 0 0 * * *, les trois étoiles veulent dire « n'importe quel jour du mois, n'importe quel mois, n'importe quel jour de la semaine ». Combiné aux deux premiers champs fixés à 0, on obtient « tous les jours à minuit ». L'étoile peut aussi se combiner à un pas : */15 en minute = toutes les 15 minutes.

Crontab a-t-il un fuseau horaire ?

Par défaut, le fuseau du serveur. Sur un crontab Linux, c'est la TZ système (souvent UTC sur les VPS et les conteneurs). GitHub Actions force UTC. Kubernetes CronJob utilise le fuseau du contrôleur, configurable via spec.timeZone depuis la 1.27. AWS EventBridge évalue les expressions en UTC. Les planificateurs applicatifs (Symfony Scheduler, Quartz, Airflow) permettent souvent de fixer un fuseau dédié à chaque tâche. En cas de doute, vérifiez date sur le serveur cible et comparez à la sortie du cron converter.

Cron job vs commande at : laquelle choisir ?

cron sert à exécuter une tâche récurrente selon un planning. at sert à exécuter une commande une seule fois à un instant donné. Pour une sauvegarde quotidienne, une rotation de logs ou un appel d'API régulier, utilisez cron. Pour différer une opération unique (« relance ce déploiement à 22h ce soir »), utilisez at :

$ echo "/usr/local/bin/deploy.sh" | at 22:00
Comment tester une expression cron sans la déclencher ?

C'est précisément le rôle de ce cron converter : il calcule les N prochaines exécutions à partir de l'instant courant, sans démarrer aucun job. Vous voyez immédiatement si votre crontab expression tire à 03h00 comme prévu ou à 03h17 par accident. Pour aller plus loin avant d'installer la tâche, vous pouvez aussi tester le script seul (bash -x script.sh) et vérifier la syntaxe d'un fichier crontab avec crontab -T fichier sur les distributions qui le supportent.

Que se passe-t-il si jour-du-mois et jour-de-la-semaine sont tous deux fixés ?

Sur Vixie cron (Linux), la règle est un OU logique : le job tire si l'un ou l'autre des deux champs matche. C'est contre-intuitif et source de bugs. Quartz utilise un ET, d'où l'introduction du symbole ? pour signaler explicitement « pas de contrainte ». En règle générale, ne fixez qu'un seul des deux champs.

Exemple de requête

curl -X POST https://cdrn.fr/api/v1/tools/cron-converter/execute \
  -H "Content-Type: application/json" \
  -d '{"cron":"...","number_next_date":1}'

Schéma d'entrée

Champ Type Requis Défaut
cron string
number_next_date integer

Points d'accès

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