Un collègue a collé ce cron : 0 9 star star 1-5, en disant que ça tourne du lundi au vendredi à 9h. J’ai regardé et je lui ai dit que ça ne tournerait pas ce lundi. Pas une blague — chacun des 5 champs a ses propres règles. Se tromper sur un seul, et votre schedule n’est pas ce que vous pensez.
Ce guide existe pour que la prochaine fois que vous lirez une expression cron, vous n’ayez pas besoin d’ouvrir la man page de crontab(5) pour comprendre ce qu’elle fait réellement.
Résumé en 30 secondes
- Une expression cron a 5 champs, de gauche à droite : minute, hour, day-of-month, month, day-of-week.
- Chaque champ peut être star (n’importe), un nombre, une plage (9-17), un pas (star/15), ou une liste (1,15).
- Sunday dans le champ day-of-week est 0 (et 7 est accepté comme alias). N’écrivez jamais 7 pour la portabilité — certains schedulers le rejettent.
- Quand day-of-month et day-of-week sont tous les deux restreints (ni l’un ni l’autre n’est star), la règle de déclenchement est OR : toute correspondance compte.
- Le jour d’une transition DST, cron peut manquer une exécution ou en déclencher deux. C’est une limitation de cron, pas un bug.
5 scénarios réels : pièges champ par champ
Scénario 1 : star/15 dans minute — vous ne savez pas vraiment ce que ça fait
Un collègue a écrit star/15 star star star star en pensant toutes les 15 minutes. Réalité : minute=0, 15, 30, 45.
Piège : beaucoup de développeurs supposent que star/15 commence à compter à partir de la minute courante, puis toutes les 15 après. Faux. Ça commence à la borne inférieure du champ (0) et sélectionne les valeurs par pas. Donc un schedule qui commence à 5:07:23 tourne d’abord à 5:15:00, pas 5:22:23.
Fix : utilisez des valeurs explicites, ou ouvrez star/15 dans un cron generator et vérifiez le preview. star/5 signifie 0, 5, 10, …, 55 — cinq valeurs, intervalles de cinq minutes.
Scénario 2 : plage horaire 9-17
Les vieux tutoriels disent que les horaires de travail sont 9-17. L’expression 0 9-17 star star star signifie déclenchement à hour=9, 10, 11, 12, 13, 14, 15, 16, 17 — neuf heures différentes, une fois chacune.
Piège : ce n’est pas 9h-17h comme fenêtre. Ça ne déclenche pas à 17:30 (l’exécution 17:00:00 est la dernière), et rien ne déclenche après 18:00. Pour toutes les 30 minutes pendant les horaires de travail, écrivez star/30 9-17 star star star — 9:00, 9:30, 10:00, 10:30, …, 17:00, 17:30 — 18 exécutions par jour sur 9 heures.
Scénario 3 : day-of-month star vs nombres spécifiques
Tâche : lancer un rapport le 1 de chaque mois. 0 0 1 star star semble correct, et il n’y a pas de problème ici.
Piège : parfois les équipes veulent le dernier-jour-du-mois et écrivent 0 0 L star star. Mais L est une extension Quartz ; Vixie cron (le cron par défaut Linux) ne la reconnaît pas. Pour le support Quartz, il vous faut soit un scheduler Quartz, soit gérer ça dans le script.
Fix : une approche fiable de fin de mois est le repli sur jour ouvré. Si le dernier jour tombe un week-end, lancez le vendredi précédent. Utilisez 0 0 star star 1-5 avec la plage day-of-month 28-31, et laissez le script décider si aujourd’hui est le dernier jour ouvré.
Scénario 4 : Sunday dans day-of-week est 0, pas 7
Tâche : backup chaque dimanche à 3h. Le collègue écrit 0 3 star star SUN — vous savez que c’est dimanche. Mais s’il écrit 0 3 star star 7, comment interprétez-vous ?
Piège : Vixie cron / cronie acceptent 0 et 7 comme Sunday. Certains schedulers (Quartz ancien, certaines configs anciennes d’AWS EventBridge) n’acceptent que 0 et rejettent 7.
Fix : écrivez toujours 0. C’est le standard RFC et a la meilleure portabilité. Traitez le 7 comme une extension spécifique au parser.
Scénario 5 : abréviation de mois JAN FEB MAR … DEC
Exemple de documentation : 0 9 star JAN-MAR star. Syntaxe valide, équivalent à 0 9 star 1-3 star.
Piège : les abréviations ne fonctionnent que dans le champ day-of-week (SUN MON TUE WED THU FRI SAT) et dans le champ month (JAN … DEC). Vous ne pouvez pas utiliser d’abréviation dans minute / hour / day-of-month.
Fix : si votre équipe est à l’aise avec les abréviations, utilisez-les ; en cas de doute, revenez à 0-6 pour weekday et 1-12 pour month.
4 faits contre-intuitifs sur cron
Fait 1 : day-of-month et day-of-week sont OR, pas AND
Tâche : déclencher le dimanche de chaque semaine, OU le 1 de chaque mois. 0 0 1 star 0 se lit comme : seulement quand 1-du-mois et dimanche coïncident. Faux.
Règle réelle : quand day-of-month et day-of-week sont tous les deux restreints (ni l’un ni l’autre n’est star), la règle OR s’applique. Toute correspondance déclenche. Donc 0 0 1 star 0 = exécutions du 1-du-mois + exécutions de chaque dimanche (peut produire 1-2 déclenchements dans un mois donné selon le calendrier).
Pour une sémantique AND stricte, utilisez un script ou changez de scheduler (k8s CronJob supporte une sémantique de champs plus riche).
Fait 2 : star signifie des choses différentes dans des champs différents
star dans minute = n’importe quel 0-59, chaque minute. star dans hour = n’importe quel 0-23, chaque heure pile. La différence est la fréquence — star de minute c’est par minute, star des autres champs signifie la fréquence maximale permise pour ce champ.
Fait 3 : star/S est équivalent à 0/S
star/15 est pareil que 0/15, dans le champ minute où la borne inférieure est 0. 9-17/2 donne 9, 11, 13, 15, 17 — cinq valeurs.
Piège : écrire 1/15 dans le champ minute donne 1, 16, 31, 46 — quatre valeurs, pas toutes-les-15-minutes à partir de 1.
Fait 4 : les jours DST peuvent manquer une exécution ou en déclencher deux
Sur les transitions DST nord-américaines (deuxième dimanche de mars / premier dimanche de novembre), l’heure locale saute ou répète une heure. Cron ordonnance par rapport à l’heure locale wall-clock, et les implémentations varient.
Fix : pour les tâches sensibles au temps, n’utilisez pas cron seul. Utilisez systemd timer ou k8s CronJob en UTC avec timezone explicite — pas de drift DST.
3 templates réels de schedule
Template 1 : toutes les 15 minutes pendant les horaires de travail
star/15 9-17 star star 1-5
Signification : lundi au vendredi, 9h à 17h inclus, toutes les 15 minutes.
Fréquence : 9 heures × 4 par heure = 36 exécutions par jour ouvré, pas de week-end. Vous en voulez moins ? star/30 donne 18 par jour.
Template 2 : fin de semaine vendredi à 18h
0 18 star star 5
Note : la valeur de day-of-week est 5, pas FRI — c’est équivalent. Testez lequel votre cron de déploiement accepte ; certaines implémentations rejettent l’abréviation.
Fréquence : une fois par semaine, vendredi 18h. Le lundi matin le rapport devrait déjà être dans l’inbox.
Template 3 : backup mensuel le 1 à minuit, repli sur vendredi précédent si le 1 tombe un week-end
Ça ne s’exprime pas en cron seul — ça demande un script wrapper.
Implémentation de référence : un script bash (a.sh) qui vérifie d’abord avec date si aujourd’hui est le premier. Si oui, lance le backup. crontab lance alors 0 0 28-31 star star 1-5 /path/to/a.sh — jour ouvré de la dernière semaine de chaque mois à minuit, le script vérifie si aujourd’hui est le jour avant le 1, et lance le backup si oui.
Pratiques recommandées
- N’écrivez pas cron à l’aveugle — ouvrez crontab.guru ou notre cron generator et visualisez les champs, vérifiez la description en langage naturel.
- Vérifiez toujours la liste next-run avant de déployer — piick cron-generator affiche par défaut les 5 prochaines exécutions ; collez votre expression, voyez si les temps correspondent à la fenêtre attendue.
- Pour les tâches sensibles au temps utilisez UTC plus TZ explicite — DST est le péché originel de cron ; systemd timer ou k8s CronJob avec spec.timezone=UTC l’évite.
- Ne fourrez pas dernier-jour-du-mois dans day-of-month 31 — L est Quartz et peu fiable cross-platform ; laissez le script décider.
- Les tâches critiques ont besoin de timeout et retry — cron ne se soucie pas de savoir si la tâche s’est terminée ; kill -9 timeout n’interrompt pas la tâche. Utilisez systemd OnFailure pour les retries.
Cron est un des outils les plus pratiques d’Unix — 5 champs, syntaxe simple, cross-platform. Nous avons construit cron-generator pour transformer les champs en dropdowns plus preview temps réel plus liste next-run, pour qu’il soit plus difficile de tomber dans un piège en les écrivant.
Essayez notre outil cron generator, passez en Visual Builder ou Raw Editor, collez star/15 9-17 star star 1-5, voyez si les 5 prochaines exécutions tombent dans les horaires de travail 9-17 en semaine. Si oui — félicitations, votre premier schedule cron atterrit. Sinon — utilisez le feedback des next-runs pour trouver quel champ est faux.