Une expression cron est la manière la plus concise de dire à un ordinateur « exécute cette chose sur ce planning ». Cinq champs, tous des chiffres et des caractères spéciaux, aucune ambiguïté une fois que vous avez appris la syntaxe. Le problème : il y a environ quinze modèles courants dont vous avez réellement besoin, et le reste du temps, vous fixez un prompt crontab -e en essayant de vous souvenir si dimanche est 0 ou 7.
Cet article est la référence que j’aurais aimée avoir il y a cinq ans. Chaque modèle courant, avec une expression à copier-coller, une explication et une note sur le piège qui attrape les gens.
Les cinq champs
* * * * *
│ │ │ │ │
│ │ │ │ └── jour de la semaine (0-6, dimanche=0)
│ │ │ └──── mois (1-12)
│ │ └────── jour du mois (1-31)
│ └──────── heure (0-23)
└────────── minute (0-59)
Chaque champ peut être :
- Une valeur spécifique :
5 - Un joker :
*(toute valeur) - Une plage :
1-5 - Un pas :
*/15(tous les 15) - Une liste :
1,15,30 - Une plage avec pas :
1-30/5(tous les 5 entre 1 et 30)
C’est tout. Le reste consiste à combiner ces primitives.
Les modèles
Chaque minute
* * * * *
Cas d’utilisation : un travail qui devrait toujours être en cours d’exécution et le planificateur le relance. Rarement ce que vous voulez.
Toutes les N minutes
*/5 * * * * # toutes les 5 minutes
*/15 * * * * # toutes les 15 minutes
*/30 * * * * # toutes les 30 minutes
Le */5 signifie « en commençant à 0, toutes les 5 minutes ». Donc 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55.
Piège : la première exécution de */5 est à la minute 0, pas au moment où vous avez enregistré le crontab. Si vous l’enregistrez à 12h03, la première exécution est à 12h05, pas à 12h08.
Chaque heure pile
0 * * * *
Piège : c’est « minute 0 de chaque heure », soit 1h00, 2h00, 3h00, etc. Si vous voulez « chaque heure, 30 minutes après », utilisez 30 * * * *.
Chaque jour à minuit
0 0 * * *
Piège : le fuseau horaire du serveur. cron utilise le fuseau horaire système. Si votre serveur est en UTC et que vous voulez minuit à l’heure de l’Est américain, vous devez convertir. La solution la plus propre : configurer le fuseau horaire système selon vos besoins, ou définir la variable d’environnement CRON_TZ (prise en charge par la plupart des implémentations cron modernes).
Chaque jour à une heure précise
0 9 * * * # 9h00
30 14 * * * # 14h30
0 0 * * * # minuit
15 3 * * * # 3h15
Chaque jour ouvrable à 9h
0 9 * * 1-5
Le 1-5 est le jour de la semaine, du lundi au vendredi.
Piège : 0 et 7 signifient tous deux dimanche. La spécification POSIX accepte les deux. La plupart des implémentations sont tolérantes si vous utilisez accidentellement 7. Ne comptez pas là-dessus.
Chaque lundi
0 0 * * 1
Minuit chaque lundi.
Deux fois par semaine (lundi et jeudi)
0 9 * * 1,4
9h le lundi et le jeudi.
Premier de chaque mois
0 0 1 * *
Minuit le 1er.
Dernier jour du mois
0 0 L * *
Le L est une extension Vixie cron / Quartz. Le cron standard ne l’a pas. Si vous utilisez le cron standard, vous êtes limité aux approximations du « dernier jour » comme 0 0 28-31 * * (qui s’exécute les 28, 29, 30 et 31, et le 28 février).
Chaque trimestre
0 0 1 */3 *
Minuit le 1er janvier, avril, juillet, octobre.
Chaque dimanche à midi
0 12 * * 0
Toutes les 6 heures
0 */6 * * *
0h00, 6h00, 12h00, 18h00.
Chaque minute entre 9h et 17h, jours ouvrables
* 9-17 * * 1-5
Un travail qui s’exécute chaque minute de 9h00 à 17h59, du lundi au vendredi. Probablement trop agressif — mais possible.
À 2h30 le premier de chaque mois
30 2 1 * *
À 23h le dernier vendredi du mois
0 23 * * 5#5
Le 5#5 est « 5e vendredi du mois » (syntaxe Quartz). Le # et le L sont des extensions non standard — le cron standard n’a pas d’expression « dernier vendredi du mois ». Si vous avez besoin de cela en cron standard, vous avez besoin d’un script wrapper qui vérifie la date.
Toutes les 30 secondes
Le cron standard ne descend pas en dessous d’1 minute. Pour la planification sous-minute :
- systemd timers :
OnUnitActiveSec=30s - Dans un Kubernetes CronJob : pas possible (minimum 1 minute). Utilisez un Job régulier avec
sleep 30dans une boucle. - Dans une application Node.js :
setInterval(fn, 30_000)à l’intérieur du processus.
Heure d’été
Le cron gère l’heure d’été en exécutant le travail deux fois (printemps) ou en le sautant (automne), selon l’implémentation. Si votre travail est sensible au temps (un lancement de facturation, un rapport), planifiez-le bien en dehors de la fenêtre 1h-3h du matin pour éviter les surprises d’heure d’été.
Le planificateur Quartz gère cela avec le drapeau DST. Le cron standard ne le fait pas.
La limite de granularité d’1 minute
Le cron est fondamentalement un outil avec une résolution d’1 minute. Si vous avez besoin d’une planification sous-minute, la réponse est « utilisez un autre outil ». Pour Kubernetes spécifiquement :
apiVersion: batch/v1
kind: CronJob
metadata:
name: every-30-seconds
spec:
schedule: "* * * * *"
startingDeadlineSeconds: 10
jobTemplate:
spec:
template:
spec:
containers:
- name: worker
image: myworker:latest
command: ["/bin/sh", "-c", "for i in 1 2; do do_work; sleep 30; done"]
Cela exécute le travail toutes les 30 secondes en émettant deux sous-travaux par minute. C’est rudimentaire, mais ça fonctionne.
Qu’en est-il de Quarkus, EventBridge, Kubernetes CronJob ?
Différents planificateurs utilisent des syntaxes cron légèrement différentes. La forme à cinq champs est la plus courante. Quelques autres :
- Quartz : six champs (avec secondes), et le joker
?pour « pas de valeur spécifique ». - AWS EventBridge : six champs, prend en charge les extensions
Let#. - Kubernetes CronJob : cinq champs, pas de prise en charge de
Lou#. - Spring
@Scheduled: six champs (avec secondes), prise en charge de?etL. - GitHub Actions : cinq champs, pas d’extensions.
Si vous utilisez un outil qui ne correspond pas au standard, consultez la documentation. La plupart des modèles de cette référence se transfèrent directement. Les extensions non standard (L, #, W) ne le font pas.
Générer des expressions cron sans mémoriser la syntaxe
Si vous ne voulez pas mémoriser la syntaxe, le générateur cron sur DevSpeedTools vous permet de cliquer à travers les cinq champs et vous affiche les cinq prochaines exécutions planifiées. C’est le moyen le plus rapide de vérifier « est-ce que 0 9 * * 1-5 signifie vraiment 9h les jours ouvrables ? » — la réponse est oui, mais voir les dates des prochaines exécutions rend le modèle concret.
Pour des expressions ponctuelles, crontab.guru est la référence standard. Le générateur cron fait le même travail et est entièrement côté client, donc les expressions que vous collez ne quittent jamais votre navigateur.
Le résumé
Les expressions cron sont un petit DSL avec quelques règles. Apprenez les cinq champs, apprenez * (n’importe lequel), - (plage), / (pas) et , (liste), et vous pouvez exprimer 95 % des plannings dont vous aurez jamais besoin. Les 5 % restants nécessitent des extensions spécifiques au planificateur ou un autre outil. En cas de doute, générez et prévisualisez l’expression avec un outil qui affiche les prochaines exécutions — beaucoup plus rapide que le débogage mental.