Qu'est-ce qu'une expression cron ?
Cron est un planificateur de tâches basé sur le temps, intégré aux systèmes Unix/Linux. Une expression cron est la syntaxe qui indique à cron quand exécuter une tâche.
Tu les as déjà vus : 0 0 * * *. Ça veut dire "à minuit, tous les jours." Mais dès qu'on dépasse les bases, la syntaxe cron devient vite complexe — 5 champs, secondes optionnelles, différences entre plateformes, et caractères spéciaux que la plupart des gens copient-collent sans comprendre.
Ce guide démystifie tout ça.
Les 5 (ou 6) champs
Le cron standard utilise 5 champs séparés par des espaces :
┌──────────── minute (0–59)
│ ┌────────── heure (0–23)
│ │ ┌──────── jour du mois (1–31)
│ │ │ ┌────── mois (1–12)
│ │ │ │ ┌──── jour de la semaine (0–7, 0 et 7 = dimanche)
│ │ │ │ │
* * * * *
Certains systèmes (AWS EventBridge, Spring, Quartz) ajoutent un champ secondes au début, ce qui donne 6 champs. Vérifie ta plateforme.
Caractères spéciaux
| Caractère | Signification | Exemple |
|---|---|---|
* | Toutes les valeurs | * * * * * = chaque minute |
, | Valeurs multiples | 0 9,17 * * * = 9h et 17h |
- | Plage | 0 9-17 * * * = chaque heure de 9h à 17h |
/ | Pas | */15 * * * * = toutes les 15 minutes |
L | Dernier | 0 0 L * * = dernier jour du mois (Quartz uniquement) |
? | Sans valeur | 0 0 ? * MON = lundis, n'importe quel jour du mois (Quartz) |
Expressions cron courantes
Chaque minute
* * * * *
Toutes les 5 minutes
*/5 * * * *
Chaque heure, pile
0 * * * *
Tous les jours à minuit
0 0 * * *
Tous les jours à 9h
0 9 * * *
Tous les lundis à 9h
0 9 * * 1
Tous les jours de semaine (lun–ven) à 8h
0 8 * * 1-5
Chaque week-end à midi
0 12 * * 0,6
Premier jour de chaque mois à minuit
0 0 1 * *
Chaque trimestre (jan, avr, juil, oct) à minuit
0 0 1 1,4,7,10 *
Toutes les 30 minutes entre 9h et 17h en semaine
*/30 9-17 * * 1-5
Les pièges
"Toutes les 2 heures" c'est 0 */2 * * *, pas */2 * * * *
*/2 * * * * signifie toutes les 2 minutes. Le pas s'applique au champ dans lequel il se trouve.
Dimanche c'est 0 ET 7
En cron standard, 0 et 7 correspondent tous deux au dimanche. Évite l'ambiguïté — utilise 0 de façon constante.
Jour du mois ET jour de la semaine sont en OU, pas en ET
0 0 1 * 1 s'exécute le 1er de chaque mois ET chaque lundi — pas uniquement les lundis qui tombent le 1er. Si tu veux "le premier lundi du mois", c'est plus complexe (nécessite une logique de script en dehors de cron).
Les fuseaux horaires
Cron s'exécute dans le fuseau horaire local du serveur, sauf configuration contraire. Une tâche à 0 9 * * * sur un serveur UTC s'exécute à 9h UTC — soit potentiellement 2h ou 23h dans ton fuseau.
Toujours vérifier :
timedatectl # affiche le fuseau horaire actuel sous Linux
Raccourcis nommés (non standard mais très supportés)
| Raccourci | Équivalent | Signification |
|---|---|---|
@yearly | 0 0 1 1 * | Une fois par an |
@monthly | 0 0 1 * * | Une fois par mois |
@weekly | 0 0 * * 0 | Une fois par semaine (dimanche) |
@daily | 0 0 * * * | Une fois par jour (minuit) |
@hourly | 0 * * * * | Une fois par heure |
@reboot | — | Au démarrage du système |
Générer et valider des expressions cron
Cron Generator permet de construire des expressions visuellement — choisir la planification en langage clair, obtenir l'expression cron. Plus besoin de deviner si 0 9 * * 1-5 est correct.
Fonctionne aussi en sens inverse : colle n'importe quelle expression cron et obtiens une explication en français de quand elle s'exécute.
Mémo rapide
# ┌──── minute 0-59
# │ ┌─── heure 0-23
# │ │ ┌── jour 1-31
# │ │ │ ┌─ mois 1-12
# │ │ │ │ ┌ semaine 0-7 (0=dim)
# │ │ │ │ │
* * * * * chaque minute
0 * * * * chaque heure
0 0 * * * tous les jours à minuit
0 9 * * 1 tous les lundis à 9h
*/15 * * * * toutes les 15 minutes
0 0 1 * * premier jour de chaque mois