Qu'est-ce qu'une expression cron ? Syntaxe et 15 exemples
Une expression cron est une courte chaîne de caractères qui indique à un planificateur quand exécuter une tâche. La forme standard comporte cinq champs séparés par des espaces : minute, heure, jour du mois, mois et jour de la semaine. Par exemple, */15 * * * * signifie « toutes les 15 minutes » : */15 dans le champ des minutes correspond aux minutes 0, 15, 30 et 45, et les quatre astérisques signifient n'importe quelle heure, n'importe quel jour, n'importe quel mois et n'importe quel jour de la semaine.
Essayez gratuitement : Générateur de Crontab Gratuit, sans création de compte.
Le nom vient de cron, le planificateur de tâches d'Unix, mais la même syntaxe pilote aujourd'hui des pipelines CI, des planificateurs cloud et des frameworks applicatifs, parfois avec des champs supplémentaires. Ce guide présente la syntaxe, 15 exemples vérifiés, les variantes courantes et les erreurs qui font tourner une tâche au mauvais moment. Pour vérifier une expression au fil de la lecture, collez-la dans le générateur de Crontab gratuit, qui décrit la planification en langage clair.
Les cinq champs d'une expression cron
Les champs se lisent de gauche à droite :
| 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 désignent tous deux le dimanche) | sun–sat |
Les heures utilisent le format 24 heures : 14 h s'écrit donc 14. Les noms correspondent aux trois premières lettres du mois ou du jour en anglais, sans distinction entre majuscules et minuscules. Certaines implémentations, dont le cron de macOS, n'acceptent pas les noms dans les plages ou les listes : 1-5 est donc plus portable que mon-fri.
Dans un fichier crontab, la commande suit les cinq champs : 0 2 * * * /home/me/backup.sh. Sous Linux, le fichier système /etc/crontab comporte en plus un champ pour le nom d'utilisateur avant la commande.
Caractères spéciaux : astérisque, virgule, tiret et barre oblique
Quatre caractères font presque tout le travail :
| Caractère | Signification | Exemple | Correspond à |
|---|---|---|---|
* |
Toutes les valeurs | * dans le champ des heures |
Heures 0, 1, 2 … 23 |
, |
Liste | 8,20 dans le champ des heures |
Heures 8 et 20 |
- |
Plage (bornes incluses) | 1-5 dans le jour de la semaine |
Du lundi au vendredi |
/ |
Pas | */15 dans le champ des minutes |
Minutes 0, 15, 30, 45 |
On peut les combiner. 9-17/2 dans le champ des heures correspond à 9, 11, 13, 15 et 17, et 0-4,8-12 est une liste de deux plages.
Les pas repartent de zéro à chaque cycle. */7 dans le champ des minutes correspond à 0, 7, 14 … 56, puis de nouveau à 0 au début de l'heure suivante : entre :56 et :00, il s'écoule donc quatre minutes, pas sept. Un pas qui ne divise pas exactement 60 minutes ou 24 heures ne donne jamais un intervalle parfaitement régulier.
15 exemples d'expressions cron
Chaque exemple a été vérifié champ par champ. Les heures s'entendent dans le fuseau horaire du planificateur.
| Expression cron | Quand elle s'exécute |
|---|---|
* * * * * |
Toutes les minutes |
*/5 * * * * |
Toutes les 5 minutes (:00, :05, :10 …) |
30 * * * * |
Toutes les heures à la demie (00:30, 01:30 …) |
0 */2 * * * |
Toutes les 2 heures pile (00:00, 02:00 … 22:00) |
0 2 * * * |
Tous les jours à 02:00 |
0 8,20 * * * |
Deux fois par jour, à 08:00 et à 20:00 |
0 9 * * 1-5 |
Du lundi au vendredi à 09:00 |
*/15 9-17 * * 1-5 |
Toutes les 15 minutes de 09:00 à 17:45, du lundi au vendredi |
0 6 * * 0,6 |
Le samedi et le dimanche à 06:00 |
0 0 * * 0 |
Chaque dimanche à minuit |
0 22 * * 5 |
Chaque vendredi à 22:00 |
0 0 1 * * |
Le 1er de chaque mois à minuit |
0 12 15 * * |
Le 15 de chaque mois à 12:00 |
0 0 1 1,4,7,10 * |
Chaque trimestre : le 1er janvier, avril, juillet et octobre à minuit |
0 0 1 1 * |
Une fois par an, le 1er janvier à minuit |
Deux détails passent facilement inaperçus. D'abord, les plages incluent leurs deux bornes : 9-17 inclut donc l'heure 17, et */15 9-17 * * 1-5 s'exécute 36 fois par jour, la dernière fois à 17:45 et non à 17:00. Ensuite, 0 0 1 */3 * donne le même calendrier trimestriel, car */3 dans le champ du mois commence à 1 et correspond aux mois 1, 4, 7 et 10.
Macros non standard : @daily, @weekly et @reboot
De nombreuses implémentations de cron acceptent un mot-clé à la place des cinq champs :
| Macro | Équivaut à | S'exécute |
|---|---|---|
@yearly ou @annually |
0 0 1 1 * |
À minuit le 1er janvier |
@monthly |
0 0 1 * * |
À minuit le 1er de chaque mois |
@weekly |
0 0 * * 0 |
Le dimanche à minuit |
@daily ou @midnight |
0 0 * * * |
Tous les jours à minuit |
@hourly |
0 * * * * |
À la minute 0 de chaque heure |
@reboot |
– | Une fois, au démarrage du démon cron |
Vixie cron, cronie et le cron de macOS les prennent toutes en charge, et les CronJobs Kubernetes acceptent celles qui sont liées au temps, mais pas @reboot. Elles ne font pas partie de la norme POSIX : consultez donc la documentation avant de les utiliser ailleurs.
Variantes de cron : secondes, années et caractères supplémentaires
Tous les planificateurs ne lisent pas cinq champs : vérifiez pour quel dialecte vous écrivez.
- Quartz (Java) utilise six ou sept champs : secondes, minutes, heures, jour du mois, mois, jour de la semaine et une année facultative. L'un des deux champs de jour doit valoir
?(« aucune valeur précise »). Quartz prend aussi en chargeL(dernier),W(jour ouvré le plus proche) et#(n-ième jour de la semaine du mois) :0 15 10 L * ?s'exécute à 10:15 le dernier jour de chaque mois, et0 15 10 ? * 6#3à 10:15 le troisième vendredi, car Quartz numérote les jours de la semaine de 1 à 7 en commençant par le dimanche. - Les expressions Spring de
@Scheduled(cron = "…")comptent six champs : d'abord les secondes, puis les cinq habituels, sans année. - Les règles AWS EventBridge utilisent
cron(minutes hours day-of-month month day-of-week year): six champs, pas de secondes, une année à la fin et un?dans l'un des deux champs de jour.cron(0 12 * * ? *)s'exécute tous les jours à 12:00 UTC. Les règles d'un bus d'événements fonctionnent en UTC, tandis qu'EventBridge Scheduler permet de choisir un fuseau horaire. Comme Quartz, AWS numérote les jours de la semaine de 1 à 7, avec 1 = dimanche. - Les CronJobs Kubernetes utilisent les cinq champs standard dans
spec.schedule. Sansspec.timeZone, la planification suit le fuseau horaire du kube-controller-manager. Indiquez un nom IANA commeEurope/Berlinpour le fixer. - Les déclencheurs
schedulede GitHub Actions utilisent cinq champs et s'exécutent en UTC, sauf si vous indiquez un fuseau horaire IANA facultatif. L'intervalle le plus court pris en charge est de cinq minutes, les macros comme@dailyne sont pas prises en charge, et les exécutions planifiées peuvent démarrer en retard quand GitHub est très sollicité, surtout au début de chaque heure.
Le piège du jour du mois et du jour de la semaine
Dans le cron standard (Vixie), les deux champs de jour sont combinés par un OU, et non par un ET, lorsque les deux sont restreints. Si l'un d'eux vaut *, seul l'autre compte. 0 9 1-7 * 1 ne signifie donc pas « le premier lundi du mois ». La tâche s'exécute à 09:00 chacun des jours 1 à 7 et, en plus, tous les lundis, soit 10 ou 11 exécutions par mois.
Pour ne l'exécuter que le premier lundi, gardez un seul champ de jour dans l'expression et vérifiez l'autre dans la commande :
0 9 1-7 * * [ "$(date +\%u)" = 1 ] && /path/to/report.sh
date +%u affiche le jour de la semaine sous forme de nombre de 1 à 7, avec lundi = 1. Le signe pourcentage doit être échappé en \%, car cron transforme un % non échappé de la commande en saut de ligne. Quartz et AWS évitent cette ambiguïté en imposant ? dans l'un des deux champs de jour.
Fuseaux horaires et heure d'été
Cron fonctionne dans le fuseau horaire de la machine ou du service qui évalue l'expression, souvent l'UTC sur les serveurs et les plateformes cloud, et non votre heure locale. 0 9 * * * sur un serveur en UTC s'exécute à 09:00 UTC, soit 11:00 à Paris à l'heure d'été (UTC+2). Le convertisseur de fuseaux horaires vous aide à traduire une heure locale dans le fuseau du planificateur.
L'heure d'été ajoute deux cas particuliers dans les fuseaux qui l'appliquent : quand on avance les horloges, une heure locale n'existe pas, et quand on les recule, une heure se produit deux fois. Le cron de Debian et cronie compensent les petits changements d'horloge pour les tâches à heure fixe : une exécution qui tombe dans l'heure sautée a lieu peu après le changement, et une exécution dans l'heure répétée n'est pas relancée. D'autres planificateurs se comportent autrement : le plus sûr est donc de faire tourner les serveurs en UTC ou de tenir les tâches importantes à l'écart des heures de changement, généralement entre 01:00 et 03:00, heure locale.
Comment tester une expression cron
Une expression cron erronée provoque rarement une erreur : la tâche s'exécute simplement au mauvais moment, ou jamais. Une courte routine permet de repérer la plupart des problèmes :
- Relisez-la en toutes lettres. Collez l'expression dans un outil qui la décrit et vérifiez que la phrase correspond à ce que vous vouliez, surtout pour les deux champs de jour.
- Testez la commande avec une planification courte. Utilisez temporairement
* * * * *pour que la tâche s'exécute dans la minute, puis passez à la vraie planification. - Conservez la sortie. Ajoutez
>> /tmp/myjob.log 2>&1après la commande pour que les erreurs soient écrites dans un fichier au lieu d'être perdues. - Consultez le journal de cron. Utilisez
grep CRON /var/log/syslogoujournalctl -u cronsous Debian et Ubuntu, etjournalctl -u crondsous Fedora et RHEL. - Utilisez des chemins absolus. Cron lance les tâches avec un environnement minimal et un
PATHréduit : une commande qui fonctionne dans votre terminal peut donc échouer sous cron.
Créer une expression avec le générateur de Crontab
Le générateur de Crontab gratuit fonctionne entièrement dans votre navigateur. Saisissez une expression ou cliquez sur un préréglage rapide comme « Toutes les 15 min », « Tous les jours à 2 h » ou « Chaque lundi », et l'outil :
- valide la syntaxe et vous signale une expression invalide ;
- décrit la planification en langage clair (en anglais) ;
- accepte les cinq champs standard, un champ de secondes facultatif au début, les noms de mois et de jours, ainsi que 7 pour le dimanche ;
- traduit les macros comme
@weeklyen leur équivalent à cinq champs et explique ce que fait@reboot; - affiche un aide-mémoire de chaque symbole avec un exemple.
Des interrupteurs permettent d'obtenir une description plus détaillée, d'afficher les heures au format 24 heures et de choisir si les numéros de jour de la semaine commencent à 0 pour le dimanche. Les caractères propres à Quartz (L, W, #) et le champ d'année ne sont pas acceptés. L'outil se contente de construire et de vérifier l'expression : pour planifier la tâche, copiez-la dans crontab -e ou dans la configuration de votre plateforme.
Questions fréquentes
Quelle est la différence entre cron et crontab ?
Cron est le service d'arrière-plan (démon) qui exécute les tâches planifiées. Une crontab, abréviation de « cron table », est le fichier qui les répertorie, une tâche par ligne : une expression cron suivie d'une commande. Vous modifiez votre propre crontab avec crontab -e et l'affichez avec crontab -l.
Une tâche cron peut-elle s'exécuter toutes les 30 secondes ?
Pas avec le cron standard, dont la plus petite unité est la minute. Les planificateurs dotés d'un champ de secondes le peuvent : Spring accepte */30 * * * * *, et Quartz exige un ? dans un champ de jour, comme dans */30 * * * * ?. Avec le cron classique, une solution courante consiste à écrire deux lignes exécutées chaque minute, dont l'une commence par sleep 30; avant la commande.
Comment exécuter une tâche cron le dernier jour du mois ?
Le cron standard n'a pas de symbole « dernier jour », mais Quartz et AWS acceptent L dans le champ du jour du mois. Avec le cron classique, planifiez les jours 28 à 31 et laissez la commande vérifier si demain est le 1er :
0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = "01" ] && /path/to/job.sh
date -d tomorrow est une syntaxe de GNU date, celle de Linux. Sous macOS, utilisez plutôt date -v+1d.
Essayez gratuitement : Générateur de Crontab Gratuit, sans création de compte.