Construire une expression cron
- Tableau de bord
- Documentation
- API
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 plage1-5, une liste1,15,30ou 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
- Choisissez un préréglage (every minute, every hour, every day, every week, every month, every year) qui correspond à la base de votre besoin.
- Affinez si nécessaire en éditant directement les cinq champs (minute, heure, jour du mois, mois, jour de la semaine).
- Lisez la phrase humaine générée par l'outil pour confirmer l'intention.
- Copiez l'expression cron produite via le bouton de copie.
- Validez le schedule avec notre cron decoder qui calcule les prochaines dates d'exécution réelles.
- 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 disponiblesGET https://cdrn.fr/api/v1/tools/cron-builder- récupère le schéma de cet outilPOST https://cdrn.fr/api/v1/tools/cron-builder/execute- exécute cet outil avec un payload JSON