Expressions Cron expliquées : Guide complet de la syntaxe
· 12 min de lecture
📑 Table des matières
- Anatomie d'une expression Cron
- Les cinq champs en détail
- Caractères spéciaux expliqués
- Modèles Cron courants
- Modèles de planification avancés
- Travailler avec Crontab
- Considérations sur les fuseaux horaires
- Débogage des tâches Cron
- Bonnes pratiques et pièges
- Outils de test et de validation
- Questions fréquemment posées
- Articles connexes
Cron est le planificateur de tâches basé sur le temps dans les systèmes d'exploitation de type Unix. Si vous devez exécuter un script à minuit, sauvegarder une base de données tous les dimanches, effacer les fichiers temporaires toutes les heures ou envoyer des rapports le premier de chaque mois, cron est votre outil. Mais sa syntaxe d'expression — ces chaînes cryptiques comme 0 */6 * * 1-5 — peut être intimidante au début.
Ce guide démystifie complètement les expressions cron. Vous apprendrez chaque champ, chaque caractère spécial, verrez des dizaines de modèles du monde réel et comprendrez les pièges de fuseau horaire qui trompent même les développeurs expérimentés. Que vous planifiiez des sauvegardes, exécutiez des scripts de maintenance ou automatisiez des rapports, maîtriser la syntaxe cron est essentiel pour tout développeur ou administrateur système.
Anatomie d'une expression Cron
Une expression cron standard comporte cinq champs séparés par des espaces. Chaque champ représente une unité de temps, et ensemble ils définissent exactement quand votre tâche doit s'exécuter.
┌───────────── minute (0-59)
│ ┌─────────── heure (0-23)
│ │ ┌───────── jour du mois (1-31)
│ │ │ ┌─────── mois (1-12)
│ │ │ │ ┌───── jour de la semaine (0-6, Dim=0)
│ │ │ │ │
* * * * * commande à exécuter
Chaque champ peut contenir un nombre, une plage, une liste, une valeur de pas ou un caractère générique. La beauté de cron est que ces simples blocs de construction se combinent pour créer des modèles de planification incroyablement flexibles.
Certaines implémentations de cron prennent en charge un sixième champ pour les secondes et un septième pour l'année, mais le format standard à cinq champs est universellement pris en charge et ce que vous rencontrerez dans la plupart des systèmes de type Unix, y compris Linux, macOS et les variantes BSD.
Les cinq champs en détail
Comprendre la plage et le comportement de chaque champ est crucial pour écrire des expressions cron correctes. Examinons chacun d'eux systématiquement.
| Champ | Plage | Caractères spéciaux | Exemple |
|---|---|---|---|
| Minute | 0-59 | * , - / | */15 (toutes les 15 min) |
| Heure | 0-23 | * , - / | 9-17 (9h à 17h) |
| Jour du mois | 1-31 | * , - / L W | 1,15 (1er et 15) |
| Mois | 1-12 ou JAN-DEC | * , - / | 1-6 (jan à juin) |
| Jour de la semaine | 0-6 ou SUN-SAT | * , - / L # | 1-5 (lun à ven) |
Champ Minute (0-59)
Le champ minute contrôle à quelle minute de l'heure votre tâche s'exécute. Une valeur de 0 signifie le début de l'heure, 30 signifie et demie, et 59 est la dernière minute de l'heure.
Les modèles courants incluent */5 pour toutes les 5 minutes, 0,30 pour deux fois par heure, ou 15 pour le quart d'heure de chaque heure.
Champ Heure (0-23)
Les heures utilisent le format 24 heures où 0 est minuit, 12 est midi et 23 est 23h. C'est l'une des sources de confusion les plus courantes pour les développeurs habitués à la notation AM/PM sur 12 heures.
Les heures de bureau sont généralement représentées par 9-17 (9h à 17h), tandis que la maintenance nocturne pourrait utiliser 0-6 (minuit à 6h).
Champ Jour du mois (1-31)
Ce champ spécifie quel jour du mois exécuter. Les valeurs valides sont de 1 à 31, bien que tous les mois n'aient pas 31 jours. Cron gère cela avec élégance — si vous spécifiez le jour 31 en février, la tâche ne s'exécutera tout simplement pas ce mois-là.
Le caractère spécial L signifie "dernier jour du mois" et s'ajuste automatiquement à la longueur du mois et aux années bissextiles.
Champ Mois (1-12)
Les mois peuvent être spécifiés numériquement (1 pour janvier jusqu'à 12 pour décembre) ou en utilisant des abréviations de trois lettres (JAN, FEB, MAR, etc.). Les abréviations ne sont pas sensibles à la casse dans la plupart des implémentations.
Les calendriers trimestriels utilisent souvent des modèles comme 1,4,7,10 (janvier, avril, juillet, octobre) ou 3,6,9,12 pour les fins de trimestre fiscal.
Champ Jour de la semaine (0-6)
Les jours de la semaine vont de 0 (dimanche) à 6 (samedi). Certains systèmes acceptent également 7 comme dimanche pour plus de commodité. Les abréviations de trois lettres (SUN, MON, TUE, etc.) sont également prises en charge.
Le modèle le plus courant est 1-5 pour les jours de semaine (lundi à vendredi), tandis que 0,6 ou 6,0 représente les week-ends.
Conseil pro : Lorsque le jour du mois et le jour de la semaine sont tous deux spécifiés (pas de caractères génériques), la tâche s'exécute lorsque l'une ou l'autre condition est remplie (logique OU), pas les deux. Cela surprend de nombreux développeurs. Par exemple, 0 0 13 * 5 s'exécute le 13 de chaque mois et tous les vendredis, pas seulement le vendredi 13.
Caractères spéciaux expliqués
Les caractères spéciaux sont ce qui donne aux expressions cron leur puissance et leur flexibilité. Chaque caractère remplit un objectif spécifique dans la définition des modèles de planification.
Astérisque (*) - Caractère générique
L'astérisque signifie "toutes les valeurs possibles" pour ce champ. C'est le caractère spécial le plus couramment utilisé et apparaît dans presque toutes les expressions cron.
* * * * *— Exécuter chaque minute de chaque jour0 * * * *— Exécuter au début de chaque heure0 0 * * *— Exécuter à minuit chaque jour
Virgule (,) - Séparateur de liste
Les virgules vous permettent de spécifier plusieurs valeurs discrètes. C'est parfait lorsque vous avez besoin d'heures spécifiques et non consécutives.
0 9,12,15,18 * * *— Exécuter à 9h, midi, 15h et 18h0 0 1,15 * *— Exécuter à minuit le 1er et le 15 de chaque mois0 0 * * 1,3,5— Exécuter à minuit le lundi, mercredi et vendredi
Trait d'union (-) - Opérateur de plage
Les traits d'union définissent des plages inclusives, facilitant la spécification de périodes continues.
0 9-17 * * *— Exécuter chaque heure de 9h à 17h0 0 * * 1-5— Exécuter à minuit du lundi au vendredi0 0 1-7 1 *— Exécuter quotidiennement pendant la première semaine de janvier
Barre oblique (/) - Valeurs de pas
La barre oblique spécifie des intervalles de pas, vous permettant d'exécuter des tâches à intervalles réguliers dans une plage. La syntaxe est début/pas ou */pas pour toute la plage.
*/15 * * * *— Toutes les 15 minutes (0, 15, 30, 45)0 */2 * * *— Toutes les 2 heures (0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22)0 0 */3 * *— Tous les 3 jours (1er, 4, 7, 10, etc.)0 9-17/2 * * *— Toutes les 2 heures entre 9h et 17h (9, 11, 13, 15, 17)
Conseil rapide : */15 ne signifie pas "toutes les 15 minutes à partir de maintenant" — cela signifie aux minutes 0, 15, 30 et 45 de chaque heure. Si vous ajoutez une tâche cron à 10h07, un modèle */15 s'exécutera d'abord à 10h15, pas à 10h22.
L - Dernier jour
Le caractère L signifie "dernier" et est utilisé dans les champs jour du mois et jour de la semaine. Il est particulièrement utile pour le traitement de fin de mois qui doit tenir compte des longueurs de mois variables.
0 0 L * *— Exécuter à minuit le dernier jour de chaque mois0 0 * * L— Exécuter à minuit le dernier jour de la semaine (samedi)0 0 * * 5L— Exécuter le dernier vendredi de chaque mois
W - Jour ouvrable le plus proche
Le caractère W trouve le jour ouvrable le plus proche d'un jour donné du mois. Si le jour spécifié tombe un week-end, la tâche s'exécute le jour ouvrable le plus proche à la place.
0 0 15W * *— Exécuter le jour ouvrable le plus proche du 150 0 1W * *— Exécuter le premier jour ouvrable du mois0 0 LW * *— Exécuter le dernier jour ouvrable du mois
Dièse (#) - Nième jour de la semaine
Le caractère dièse spécifie la Nième occurrence d'un jour de la semaine dans un mois. La syntaxe est jour#occurrence.
0 0 * * 1#1— Premier lundi de chaque mois0 0 * * 5#2— Deuxième vendredi de chaque mois0 0 * * 3#4— Quatrième mercredi de chaque mois
Notez que L, W et # ne sont pas pris en charge dans toutes les implémentations de cron. Ils sont disponibles dans les versions modernes comme Vixie cron et la plupart des planificateurs basés sur le cloud, mais peuvent ne pas fonctionner dans les anciens systèmes Unix.
Modèles Cron courants
Examinons les modèles de planification du monde réel que vous utiliserez régulièrement. Ces exemples couvrent les scénarios d'automatisation les plus courants.
Chaque minute, heure et jour
* * * * *— Chaque minute (à utiliser avec parcimonie, peut créer des problèmes de charge)0 * * * *— Chaque heure à la minute 00 0 * * *— Chaque jour à minuit0 12 * * *— Chaque jour à midi
Plusieurs fois par jour
0 0,12 * * *— Deux fois par jour à minuit et midi0 */6 * * *— Toutes les 6 heures (0h00, 6h00, 12h00, 18h00)0 8,12,16,20 * * *— Quatre fois par jour à des heures spécifiques*/30 * * * *— Toutes les 30 minutes
Horaires hebdomadaires
0 0 * * 0— Chaque dimanche à minuit0 0 * * 1-5— Jours de semaine à minuit0 9 * * 1— Chaque lundi à 9h0 0 * * 6,0— Week-ends à minuit
Horaires mensuels
0 0 1 * *— Premier jour de chaque mois à minuit0 0 L * *— Dernier jour de chaque mois à minuit0 0 1,15 * *— 1er et 15 de chaque mois0 0 1 */3 *— Premier jour de chaque trimestre (jan, avr, juil, oct)
Heures de bureau et fenêtres de maintenance
0 9-17 * * 1-5— Chaque heure pendant les heures de bureau (9h-17h, lun-ven)*/15 9-17 * * 1-5— Toutes les 15 minutes pendant les heures de bureau0 2 * * *— 2h du matin quotidiennement (fenêtre de maintenance courante)0 3 * * 0— 3h du matin chaque dimanche (maintenance hebdomadaire)
| Cas d'usage | Expression Cron | Description |
|---|---|---|
| Sauvegarde de base de données | 0 2 * * * |
Quotidiennement à 2h |
| Rotation des journaux | 0 0 * * 0 |
Hebdomadaire le dimanche à minuit |
| Effacement du cache |