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.

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 :

  1. 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.
  2. 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.
  3. Conservez la sortie. Ajoutez >> /tmp/myjob.log 2>&1 après la commande pour que les erreurs soient écrites dans un fichier au lieu d'être perdues.
  4. Consultez le journal de cron. Utilisez grep CRON /var/log/syslog ou journalctl -u cron sous Debian et Ubuntu, et journalctl -u crond sous Fedora et RHEL.
  5. Utilisez des chemins absolus. Cron lance les tâches avec un environnement minimal et un PATH ré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 :

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.