Générateur d'expressions cron, gratuit
Construisez et comprenez les plannings de tâches cron de manière visuelle.
Préréglages rapides
5 prochaines exécutions
Référence de syntaxe cron
* · n'importe quelle valeur
*/5 · toutes les 5 unités
1,15 · aux valeurs 1 et 15
1-5 · plage de 1 à 5
Champs : minute (0-59), heure (0-23), jour du mois (1-31), mois (1-12), jour de la semaine (0-6, 0=dimanche)
Une brève histoire de l'expression cron
L'expression cron à cinq champs date de mai 1975, quand une première version a été livrée par les AT&T Bell Laboratories dans le cadre de Research Unix Version 7. Le nom est un clin d'œil à Chronos, la personnification grecque du temps. Le format était simple : cinq champs séparés par des espaces (minute, heure, jour-du-mois, mois, jour-de-la-semaine) sur une ligne dans /usr/lib/crontab. La réécriture Vixie cron par Paul Vixie en 1987 est devenue l'implémentation moderne de facto ; toutes les grandes distributions Linux livrent un cron dérivé de Vixie, et Vixie a ajouté le crontab par utilisateur, la prise en charge des variables d'environnement (MAILTO=, CRON_TZ=), et les macros de raccourci @hourly / @daily / @reboot que tout le monde utilise aujourd'hui. La syntaxe de l'expression cron s'est alors divisée en deux voies. Le Quartz Scheduler (Java, James House, 1998 ; donné à Apache puis Terracotta) a ajouté un champ secondes en tête, un champ année optionnel à la fin, et les opérateurs L (last) / W (weekday) / # (nième occurrence), produisant le cron à six champs que AWS EventBridge (à l'origine CloudWatch Events, 2014) et l'annotation @Scheduled de Spring ont ensuite adopté. Le format NCronTab utilisé par Azure Functions (2016) mettait les secondes en premier mais gardait cinq champs comportementaux. L'ère du cloud a ensuite normalisé le format Vixie à cinq champs comme lingua franca : les Kubernetes CronJobs (alpha 1.4 en 2016, GA dans 1.21 en 2021) acceptent exactement cinq champs, tout comme GitHub Actions (on.schedule.cron, 2019), GCP Cloud Scheduler (2018), et Vercel Cron Jobs (2022). Les constructeurs visuels de cron, la catégorie à laquelle appartient cet outil, ont émergé entre 2010 et 2015 : crontab.guru (Christine Dodrill, 2014) est devenu la référence la plus citée, et la bibliothèque cron-descriptor (Brady Holt, à l'origine .NET, portée en Java/Python/JS) a alimenté la plupart des couches de traduction «cron en langage clair» dont dépendent les décodeurs et générateurs. Un demi-siècle après Bell Labs, les mêmes cinq champs planifient toujours les sauvegardes nocturnes du monde entier.
L'anatomie d'une expression cron
- Cinq champs, séparés par des espaces. Dans l'ordre :
minute (0-59) heure (0-23) jour-du-mois (1-31) mois (1-12) jour-de-la-semaine (0-6). L'expression0 9 * * 1signifie «minute 0, heure 9, n'importe quel jour-du-mois, n'importe quel mois, jour de la semaine 1 (lundi)», c'est-à-dire 9h00 tous les lundis. Le mois est indexé à 1 ;0 0 1 0 *est invalide car il n'y a pas de mois 0. - Les quatre opérateurs.
*correspond à toutes les valeurs de la plage du champ.,liste des valeurs discrètes :0,15,30,45dans le champ minute.-définit une plage :9-17dans le champ heure couvre 9h jusqu'à 17h./définit un pas :*/15en minutes se déclenche à 0, 15, 30, 45. Ces quatre opérateurs se combinent librement :*/15 8-18 * * 1-5signifie «toutes les 15 minutes entre 8h et 18h, en semaine uniquement». - Macros de raccourci. Vixie cron et la plupart des parseurs modernes acceptent
@yearly(ou@annually, équivalent à0 0 1 1 *),@monthly(0 0 1 * *),@weekly(0 0 * * 0),@daily(ou@midnight,0 0 * * *),@hourly(0 * * * *), et le spécial@reboot(s'exécute une fois quand le daemon cron démarre). Les plateformes cloud varient : GitHub Actions et Vercel rejettent les macros. - Le piège du pas.
*/Ndans un champ avec la plage a-b se déclenche à a, a+N, a+2N, ..., pas nécessairement toutes les N unités de temps de l'horloge murale.*/7dans le champ minute se déclenche à 0, 7, 14, 21, 28, 35, 42, 49, 56, puis revient à 0 en haut de l'heure suivante, produisant un écart de 4 minutes. Une vraie planification toutes les 7 minutes est impossible en cron standard sans wrapper. - Le piège OU (jour-du-mois vs jour-de-la-semaine). Quand les deux champs sont restreints, le cron Unix standard se déclenche quand l'un ou l'autre correspond, pas les deux.
0 0 1 * 1ne veut pas dire «lundis qui tombent le 1er», ça veut dire «chaque 1er du mois, plus chaque lundi». La page de manuelcrontab(5)est explicite. Quartz, AWS EventBridge, et les timers systemd expriment tous «premier lundi» proprement ; Vixie cron a besoin d'un wrapper. - La numérotation du jour de la semaine varie. Linux/Vixie, GitHub Actions, GCP Cloud Scheduler, Kubernetes, Azure NCronTab, et Spring 5.3+ utilisent tous Dimanche = 0 (Vixie accepte aussi 7). Quartz et AWS EventBridge utilisent Dimanche = 1.
0 0 * * 1signifie donc «chaque lundi» sur Linux mais «chaque dimanche» sous Quartz. Utilisez les noms à trois lettres (MON,TUE) quand la portabilité compte.
Où l'expression s'utilise
- cron Linux / macOS. Collez dans
crontab -esuivi de la commande. Les noms (MON,JAN) et les macros de raccourci (@hourly,@daily,@reboot) sont acceptés. DéfinissezCRON_TZ=America/New_Yorken haut du crontab si le serveur est en UTC mais que vous voulez planifier en heure locale. - Kubernetes CronJob. Définissez
spec.scheduleavec votre expression à cinq champs.spec.timeZone(GA en 1.27, mars 2023) prend un fuseau IANA comme «Europe/Paris». L'inclusion deTZ=dans la chaîne de planification est rejetée à partir de 1.29. Utilisezspec.startingDeadlineSecondspour contrôler le comportement de rattrapage après une panne. - GitHub Actions. Déposez dans
on.schedule.cron. Les planifications s'exécutent en UTC, la cadence la plus courte est de 5 minutes (tout ce qui est plus fin est silencieusement arrondi), et les workflows planifiés dans les dépôts publics se désactivent automatiquement après 60 jours d'inactivité du dépôt. Les chaînes cron dans le YAML doivent être entre guillemets pour éviter la confusion du parseur avec le*de tête. - AWS EventBridge / EventBridge Scheduler. Utilise six champs :
cron(min hr dom mon dow yr). Nécessite?soit dans jour-du-mois soit dans jour-de-la-semaine (pas les deux littéraux). Les opérateurs de style QuartzL(dernier),W(jour ouvré), et#(nième occurrence) fonctionnent tous ici. Le produit Scheduler (2022) a ajouté une expressionat()séparée pour les timers à coup unique. - GCP Cloud Scheduler. Syntaxe à cinq champs correspondant à Linux. La propriété
timeZoneprend un fuseau IANA. Combinez avec Cloud Pub/Sub ou des cibles HTTP.retryConfiggère les échecs transitoires ; le défaut est aucun retry, ce qui surprend les ingénieurs qui s'attendent à une sémantique au moins une fois. - Vercel Cron Jobs. Syntaxe à cinq champs dans
vercel.json. Les deux champs jour ne peuvent pas être définis en même temps. Les plans Hobby plafonnent la cadence au quotidien ; les plans Pro permettent l'horaire. Déclenche un HTTP GET vers le chemin de votre fonction, ce qui signifie que la fonction doit être idempotente si le déclencheur retry jamais.
Standards, dialectes et jalons
- cron des AT&T Bell Labs (mai 1975). L'original. Cinq champs, pas de crontab par utilisateur, fonctionnait depuis
/usr/lib/crontab. Partie de Research Unix Version 7. La grammaire séparée par espaces que toutes les variantes modernes étendent. - Vixie cron (Paul Vixie, 1987). La réécriture que tout le monde fait tourner. Ajout des crontabs par utilisateur, des macros
@hourly/@daily/@reboot, des alias de noms (MON,JAN), et des variables d'environnementMAILTO/CRON_TZ. La plupart des distributions Linux livrent Vixie cron, dcron, ou cronie (un fork Red Hat de Vixie). - Quartz Scheduler (James House, 1998). Bibliothèque Java qui a introduit le cron à six champs (avec secondes en tête) et les opérateurs
L/W/#. Donnée à Apache puis Terracotta. L'annotation@Scheduledde Spring intègre la sémantique Quartz ; Spring 5.3+ a controversément changé le jour de la semaine du «Dimanche=1» de Quartz vers le «Dimanche=0» de Linux, donc la même chaîne signifie désormais des jours différents selon les versions. - timers systemd (Lennart Poettering, 2010). Remplace cron sur la plupart des distributions Linux modernes. Utilise une grammaire différente (
OnCalendar=Mon..Fri 09:00), supporte les planifications de calendrier et monotones, journalise dansjournald, peut déclarer des dépendances de service, valide avecsystemd-analyze calendar, et combine la précision style cron avec le rattrapage style anacron viaPersistent=true. - NCronTab (Azure Functions, 2016). Six champs avec les secondes en premier :
{second} {minute} {hour} {day} {month} {day-of-week}. Pas de champ année. Le fuseau horaire par défaut est UTC ; remplacez avec le paramètre d'applicationWEBSITE_TIME_ZONEsur les plans Linux App Service. - Syntaxe cron AWS EventBridge. Six champs avec l'année à la fin :
cron(min hr dom mon dow yr). Nécessite littéralement?comme placeholder dans celui de dom/dow qui n'est pas utilisé. Supporte QuartzL,W,#. À l'origine CloudWatch Events (2014), renommé EventBridge en 2019. - Le problème de portabilité 5-vs-6-champs. Coller une expression à cinq champs Linux dans Quartz ou Spring produit l'erreur «cron expression must consist of 6 fields» ; coller une expression à six champs dans cron Linux produit «bad day-of-week» parce que Linux lit la colonne secondes comme la minute. L'erreur inverse est plus dangereuse parce qu'elle peut silencieusement analyser et s'exécuter sur la mauvaise planification.
- Extension
H(hash) de Jenkins. Jenkins étend le cron standard avecH, qui choisit une valeur stable mais aléatoire par tâche plutôt que de faire tourner chaque tâche au même instant.H * * * *signifie «toutes les heures, mais à une minute différente pour chaque tâche», évitant le problème du «troupeau tonnant» quand beaucoup de tâches sont planifiées à la minute 0.
Questions fréquentes supplémentaires
Cinq champs sont-ils la même chose que six ou sept ?
Non. La forme POSIX classique est de cinq champs (minute, heure, jour-du-mois, mois, jour-de-la-semaine). Quartz et Spring utilisent six champs en ajoutant une colonne secondes en tête, et Quartz accepte un septième champ année optionnel. AWS EventBridge utilise toujours six champs se terminant par année (cron(min hr dom mon dow yr)). Coller une expression à cinq champs dans Quartz ou Spring lève une erreur de syntaxe ; coller une expression à six champs dans Linux interprète silencieusement mal les champs.
Quel est le plus petit intervalle que cron peut exprimer ?
Chaque minute (* * * * *) en cron Unix standard. Il n'y a pas de champ secondes intégré. Les ordonnanceurs comme Quartz ou NCronTab en ajoutent un si vous avez besoin d'une cadence inférieure à la minute, et les timers systemd peuvent utiliser OnUnitActiveSec=30s. GitHub Actions plafonne la cadence la plus courte à 5 minutes, et EventBridge se déclenche dans une fenêtre de 60 secondes du temps planifié, donc ne comptez pas sur cron pour une précision temps réel strict.
Comment exécuter une tâche le dernier jour du mois ?
Le cron standard à cinq champs n'a pas d'opérateur natif «dernier jour du mois». Quartz et AWS EventBridge supportent L dans le champ jour-du-mois : 0 0 L * ? se déclenche à minuit le dernier jour. Sur cron Linux pur, le contournement habituel est de planifier quotidiennement sur les jours candidats et de filtrer la commande : 0 0 28-31 * * [ "$(date +\%d -d tomorrow)" = "01" ] && /path/to/script. Les timers systemd l'expriment directement avec OnCalendar=*-*-* 00:00:00.
Pourquoi ma tâche cron ne s'est-elle pas exécutée quand je m'y attendais ?
Les suspects habituels, dans l'ordre : (1) le serveur est dans un fuseau horaire différent de celui que vous supposez (vérifiez avec date) ; (2) PATH n'est pas ce que votre shell interactif a, donc une commande fonctionne à l'invite mais échoue sous cron (utilisez des chemins absolus) ; (3) la sortie est allée par email et vous l'avez manquée (définissez MAILTO="" ou redirigez vers un fichier journal) ; (4) le daemon cron ne tourne pas (systemctl status cron) ; (5) le piège OU (voir ci-dessus) se déclenche sur des jours supplémentaires que vous n'aviez pas prévus.
Quelle est la différence entre cron, anacron, et les timers systemd ?
Cron s'attend à ce que le système soit en marche au moment planifié et saute silencieusement les tâches qui tombent pendant un temps d'arrêt : bien pour les serveurs toujours allumés, mauvais pour les ordinateurs portables. Anacron suit les horodatages de dernière exécution par tâche et rattrape les tâches manquées après un redémarrage, au prix d'une précision au niveau du jour plutôt qu'à la minute. Les timers systemd remplacent cron sur la plupart des distributions Linux modernes : ils supportent les planifications de calendrier et monotones, journalisent dans journald, peuvent déclarer des dépendances de service, et utilisent Persistent=true pour combiner la précision cron avec le rattrapage anacron.
Comment les fuseaux horaires et l'heure d'été affectent-ils cron ?
La plupart des daemons cron interprètent les planifications dans le fuseau horaire du système. Sur les serveurs cloud, cela signifie généralement UTC, donc 0 9 * * * se déclenche à 9h UTC, pas 9h locale. Définissez CRON_TZ=America/New_York dans un crontab Linux ; Kubernetes utilise spec.timeZone ; AWS, GCP, et Vercel prennent chacun un fuseau IANA explicite. Pendant le passage à l'heure d'été, les tâches planifiées dans l'heure sautée sont exécutées immédiatement après par Vixie cron mais sautées entièrement par AWS EventBridge. Le motif le plus sûr est de laisser cron en UTC et de convertir à l'intérieur de la tâche.