Les cinq champs
Le cron classique, celui de la crontab de Linux, des CronJobs Kubernetes et de GitHub Actions, lit cinq champs de gauche à droite. Chaque champ liste les valeurs auxquelles la tâche peut s'exécuter, et la tâche s'exécute chaque fois que tous les champs correspondent à l'heure actuelle. Un astérisque signifie n'importe quelle valeur.
| Position | Champ | Valeurs autorisées | Noms |
|---|---|---|---|
| 1 | Minute | 0 à 59 | |
| 2 | Heure | 0 à 23 | |
| 3 | Jour du mois | 1 à 31 | |
| 4 | Mois | 1 à 12 | JAN à DEC |
| 5 | Jour de la semaine | 0 à 7 (0 et 7 sont le dimanche) | SUN à SAT |
Essayez ici : Générateur d'expressions cron
Ouvrir la page complète de l'outilLes caractères spéciaux
Quatre caractères suffisent pour presque toutes les planifications. On peut les combiner dans un même champ, par exemple 1-5,10 ou 0-30/10.
| Caractère | Signification | Exemple | Résultat |
|---|---|---|---|
| * | Toutes les valeurs | * dans le champ des heures | Toutes les heures |
| , | Une liste de valeurs | 0,30 dans le champ des minutes | À la minute 0 et 30 |
| - | Une plage | 9-17 dans le champ des heures | Toutes les heures de 9 h à 17 h |
| / | Un pas | */15 dans le champ des minutes | Toutes les 15 minutes : 0, 15, 30, 45 |
| / après une valeur | Un pas à partir d'un départ | 5/20 dans le champ des minutes | À la minute 5, 25 et 45 |
| Raccourci @ | Une planification nommée | @daily | Identique à 0 0 * * * |
Les planifications courantes
Ces expressions ont été vérifiées avec le générateur de cette page. Copiez celle qui se rapproche le plus de votre besoin et ajustez les nombres.
| Expression | S'exécute |
|---|---|
| * * * * * | Chaque minute |
| */5 * * * * | Toutes les 5 minutes |
| */15 * * * * | Toutes les 15 minutes |
| 0 * * * * | Au début de chaque heure |
| 30 * * * * | À la minute 30 de chaque heure |
| 0 */6 * * * | Toutes les 6 heures : 0 h, 6 h, 12 h, 18 h |
| 0 0 * * * | Tous les jours à minuit |
| 0 9 * * * | Tous les jours à 9 h |
| 0 9,17 * * * | Tous les jours à 9 h et à 17 h |
| 0 9 * * 1-5 | À 9 h du lundi au vendredi |
| */10 9-17 * * 1-5 | Toutes les 10 minutes pendant les heures de bureau en semaine |
| 0 22 * * 0,6 | À 22 h le samedi et le dimanche |
| 0 9 * * 1 | Chaque lundi à 9 h |
| 0 0 1 * * | Le premier jour de chaque mois à minuit |
| 0 0 1,15 * * | Le 1er et le 15 de chaque mois |
| 0 0 1 */3 * | Le premier jour d'un mois sur trois (chaque trimestre) |
| 0 0 1 1 * | Une fois par an, le 1er janvier à minuit |
| 15 2 * * * | Chaque nuit à 2 h 15 |
| 0 12 * 6-8 * | Tous les jours à midi en juin, juillet et août |
| 0 8 1-7 * 1 | Attention : du 1 au 7 ou n'importe quel lundi, voir plus bas |
Jour du mois et jour de la semaine ensemble
C'est la règle qui piège le plus de monde. Quand les deux champs de jour sont restreints, le cron classique s'exécute les jours qui correspondent à l'un ou à l'autre, pas aux deux. Ainsi, 0 8 1-7 * 1 ne veut pas dire le premier lundi du mois : la tâche s'exécute du 1 au 7 et aussi chaque lundi. De la même façon, 0 0 13 * 5 s'exécute tous les 13 du mois et tous les vendredis, pas seulement le vendredi 13.
Il y a une subtilité de plus : si l'un des deux champs commence par un astérisque, comme dans */2, cron le considère comme non restreint pour cette règle et les deux champs doivent correspondre. 0 0 */2 * 1 ne s'exécute donc que les lundis qui tombent un jour impair du mois. Le générateur de cette page signale ces deux cas dans son explication.
Pour exécuter une tâche le premier lundi en cron classique, planifiez-la le lundi et faites-la s'arrêter dans le script si le jour du mois est supérieur à 7. Quartz peut l'exprimer directement avec 2#1.
Fuseaux horaires et changement d'heure
Cron s'exécute dans le fuseau horaire de la machine ou du service qui le fait tourner. Beaucoup de serveurs et de services cloud utilisent UTC, les planifications de GitHub Actions sont toujours en UTC, et les CronJobs Kubernetes utilisent le fuseau du contrôleur sauf si vous renseignez le champ timeZone. Certains démons cron lisent aussi une variable CRON_TZ dans la crontab.
Dans les fuseaux qui changent d'heure, comme en France, en Belgique, en Suisse ou au Québec, une nuit par an n'a pas de 2 h 30 et une autre voit revenir la même heure deux fois (en France, on passe de 2 h à 3 h au printemps et de 3 h à 2 h à l'automne, donc 2 h 30 a lieu deux fois ; aux États-Unis, c'est 1 h 30 qui revient). La plupart des démons cron sous Linux exécutent les tâches de l'heure sautée juste après le changement et n'exécutent les tâches à heure fixe qu'une seule fois pendant l'heure répétée, tandis que les tâches horaires s'exécutent les deux fois. D'autres planificateurs peuvent sauter l'exécution. Si une tâche doit s'exécuter exactement une fois par jour, planifiez-la en dehors de la plage 1 h à 3 h, ou faites tourner le planificateur en UTC. La liste des exécutions du générateur marque chaque exécution qui tombe lors d'un changement d'heure.
Secondes, Quartz et Spring
Java et certains planificateurs JavaScript ajoutent un champ des secondes au début : leurs expressions ont donc six champs, et 0 */5 * * * * s'exécute toutes les cinq minutes à la seconde 0. Quartz va plus loin et change plusieurs règles, c'est pourquoi une expression classique y échoue souvent.
- Quartz a 6 ou 7 champs : secondes, minute, heure, jour du mois, mois, jour de la semaine et une année facultative.
- Les jours de la semaine sont numérotés de 1 à 7 en commençant par le dimanche, MON vaut donc 2. Les noms comme MON-FRI évitent la confusion.
- L'un des deux champs de jour doit valoir ?, qui signifie aucune valeur précise. 0 0 9 ? * MON-FRI s'exécute à 9 h en semaine.
- L signifie dernier : L dans le champ du jour du mois est le dernier jour du mois, 6L dans le champ du jour de la semaine est le dernier vendredi.
- W choisit le jour ouvré le plus proche : 15W s'exécute le jour ouvré le plus proche du 15, LW le dernier jour ouvré du mois.
- # choisit le nième jour de la semaine : 6#3 est le troisième vendredi du mois.
- Le @Scheduled de Spring utilise aussi six champs avec les secondes en premier, mais numérote les jours de la semaine de 0 à 7 comme le cron classique et n'exige pas ?.
Les erreurs à éviter
- Écrire * * * * * alors que vous voulez une fois par jour. Le premier champ est la minute, la tâche s'exécute donc 1440 fois par jour.
- Croire que */7 dans le champ du jour du mois veut dire tous les sept jours. Cela veut dire les 1, 8, 15, 22 et 29, puis on recommence le 1er.
- Planifier le 31, le 30 ou le 29. Les mois qui n'ont pas ce jour sont sautés, la tâche n'est pas déplacée au dernier jour.
- Oublier le fuseau horaire. 0 9 * * * sur un serveur en UTC s'exécute à 9 h UTC, ce qui peut tomber en pleine nuit chez vos utilisateurs.
- Utiliser des fonctions de Quartz comme L ou ? dans une crontab Linux, ou une expression à cinq champs dans Quartz. Le générateur convertit d'une syntaxe à l'autre quand vous changez de syntaxe.