Aide-mémoire des expressions cron

Une expression cron se compose de cinq champs séparés par des espaces : minute, heure, jour du mois, mois et jour de la semaine. 0 9 * * 1-5 signifie à 9 h, du lundi au vendredi. Cet aide-mémoire couvre la syntaxe, les planifications les plus utilisées et les règles qui surprennent même les développeurs expérimentés. Collez n'importe quelle expression dans le générateur de cette page pour la lire en clair et voir ses prochaines exécutions.

7 min de lecture

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.

PositionChampValeurs autoriséesNoms
1Minute0 à 59
2Heure0 à 23
3Jour du mois1 à 31
4Mois1 à 12JAN à DEC
5Jour de la semaine0 à 7 (0 et 7 sont le dimanche)SUN à SAT

Essayez ici : Générateur d'expressions cron

Ouvrir la page complète de l'outil

Les 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èreSignificationExempleRésultat
*Toutes les valeurs* dans le champ des heuresToutes les heures
,Une liste de valeurs0,30 dans le champ des minutesÀ la minute 0 et 30
-Une plage9-17 dans le champ des heuresToutes les heures de 9 h à 17 h
/Un pas*/15 dans le champ des minutesToutes les 15 minutes : 0, 15, 30, 45
/ après une valeurUn pas à partir d'un départ5/20 dans le champ des minutesÀ la minute 5, 25 et 45
Raccourci @Une planification nommée@dailyIdentique à 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.

ExpressionS'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-5Toutes les 10 minutes pendant les heures de bureau en semaine
0 22 * * 0,6À 22 h le samedi et le dimanche
0 9 * * 1Chaque 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 * 1Attention : 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.

Étape par étape

  1. Choisissez la syntaxeChoisissez Standard pour la crontab, Kubernetes et GitHub Actions, Avec secondes pour les planificateurs qui ajoutent les secondes, ou Quartz.
  2. Partez d'une planificationCliquez sur l'une des planifications courantes ou collez votre propre expression dans la zone Expression cron.
  3. Ajustez les champsUtilisez le formulaire pour régler chaque champ sur Chaque, Tous les n, Précis ou Plage.
  4. Lisez l'explicationVérifiez la phrase et les remarques sous l'expression. Elles signalent aussi la règle des champs de jour.
  5. Vérifiez les prochaines exécutionsChoisissez le fuseau horaire de votre serveur et regardez les 10 prochaines exécutions avant de copier l'expression.

Questions fréquentes

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

Utilisez */5 * * * *. La tâche s'exécute à la minute 0, 5, 10 et ainsi de suite, à chaque heure.

Comment exécuter une tâche chaque jour de semaine à 9 h du matin ?

Utilisez 0 9 * * 1-5. En Quartz, la même planification s'écrit 0 0 9 ? * MON-FRI.

Cron peut-il exécuter une tâche toutes les 30 secondes ?

Le cron classique ne descend pas sous la minute. Les planificateurs avec un champ des secondes le peuvent, par exemple */30 * * * * *. Dans une crontab, une astuce courante consiste à ajouter deux lignes, dont l'une commence par sleep 30.

Quelle différence entre 0 et 7 dans le champ du jour de la semaine ?

Aucune en cron classique : les deux désignent le dimanche. Quartz utilise 1 pour le dimanche et 7 pour le samedi.

Pourquoi ma tâche s'est-elle exécutée un jour inattendu ?

Le plus souvent parce que les deux champs de jour étaient définis et que cron s'est exécuté les jours correspondant à l'un ou à l'autre, ou parce que le serveur utilise un autre fuseau horaire. Collez l'expression dans le générateur pour vérifier les deux.

L'expression est-elle envoyée quelque part quand je la teste ?

Non. L'explication et les heures d'exécution sont calculées dans votre navigateur.