Validateur d'expression cron : que fait vraiment cette ligne ?
Dernière mise à jour : juillet 2026 · Par Yohann Kipfer, Cron-Ping
Une expression cron, c'est cinq champs séparés par des espaces — minute heure jour-du-mois mois jour-de-semaine. Chacun accepte une valeur, une plage (1-5), une liste (1,15) ou un pas (*/10). La ligne ci-dessous tourne aux minutes 0 et 30 de chaque heure, en semaine :
0,30 * * * 1-5Collez la vôtre dans le champ, elle reste dans votre navigateur. Le décodeur développe chaque champ en valeurs réelles, affiche les cinq prochaines exécutions dans votre fuseau, et signale les pièges plus bas — ceux dont un validateur ne dit rien, parce que la ligne est syntaxiquement correcte.
Tout se calcule dans votre navigateur. Rien n'est envoyé, aucun compte.
| Champ | Vous avez écrit | Correspond à |
|---|---|---|
| minute | */5 | 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55· 12 valeurs |
| heure | * | toutes les valeurs |
| jour du mois | * | toutes les valeurs |
| mois | * | toutes les valeurs |
| jour de semaine | * | toutes les valeurs |
…
Les cinq champs
L'ordre compte, et il n'y a pas de champ secondes. Si vous avez six colonnes sous les yeux, vous lisez du Quartz ou du node-cron, pas du crontab.
| Champ | Plage | Remarques |
|---|---|---|
| minute | 0-59 | Le seul champ sans raccourci. */1 et * sont identiques. |
| heure | 0-23 | Horloge 24 h, dans le fuseau du serveur — pas le vôtre. 0 = minuit. |
| jour du mois | 1-31 | Un 31 saute février, avril, juin, septembre et novembre, sans rien dire. |
| mois | 1-12 | jan-dec acceptés comme valeurs simples (* * * jul *), pas dans une plage. |
| jour de semaine | 0-7 | 0 et 7 valent tous les deux dimanche. mon-sun acceptés comme valeurs simples. |
Aide-mémoire de la syntaxe cron
Cinq opérateurs, et c'est tout le langage. Toute expression que vous lirez est une combinaison de ceux-là.
| Syntaxe | Sens | Exemple |
|---|---|---|
* | toutes les valeurs du champ | * * * * * — chaque minute |
5 | exactement cette valeur | 5 * * * * — à la minute 5 de chaque heure |
1,15,30 | une liste de valeurs | 0 1,13 * * * — à 01:00 et 13:00 |
1-5 | une plage, bornes incluses | 0 9 * * 1-5 — 09:00 du lundi au vendredi |
*/10 | toutes les n valeurs, depuis le début de la plage | */10 * * * * — à :00, :10, :20 … |
0-30/10 | un pas dans une plage | 0-30/10 * * * * — à :00, :10, :20, :30 seulement |
jul, fri | un nom à la place d'un chiffre | 0 0 * jul * — tous les jours de juillet |
Par-dessus, crontab(5) définit sept raccourcis : @yearly (= @annually), @monthly, @weekly, @daily (= @midnight), @hourly et @reboot. Collez-en un au-dessus, le décodeur le développe. C'est lisible, mais ils se déclenchent tous à l'heure pile : si cent jobs @daily partagent une machine, ils démarrent tous ensemble à 00:00. Les étaler avec de vraies expressions coûte une ligne et évite l'embouteillage.
Les trois pièges qui passent la validation
Une ligne peut être parfaitement valide et ne pas faire ce que vous vouliez. Voici ceux que le décodeur signale, parce qu'aucun ne lève d'erreur nulle part.
Jour du mois et jour de semaine : c'est un OU, pas un ET
C'est la plus vieille surprise de cron, et elle est dans le man. Quand les deux champs de jour sont restreints, la commande tourne si l'un ou l'autre correspond. Le classique :
0 0 13 * fri # PAS les vendredis 13Cette ligne tourne tous les 13 du mois et tous les vendredis — environ 64 fois par an au lieu d'une ou deux. Quand un seul des deux champs de jour est restreint, le OU ne s'applique pas et tout se comporte comme prévu. Le vendredi 13 est réellement inexprimable en cinq champs : on teste la date dans le script.
Un pas ne fait pas le tour
*/7 * * * * ressemble à « toutes les 7 minutes ». Ça n'en est pas. Le pas repart au début de chaque heure : :00, :07, :14 … :56, puis :00 — un trou de 4 minutes là où tous les autres font 7. Pareil pour */45 (00:00 et 00:45, puis 15 minutes d'attente), et pour les heures : 0 */5 * * * saute de 20:00 à minuit.
Ça ne pose problème que si le pas ne divise pas la plage : */5, */10, */15, */20 et */30 tombent juste sur les minutes. Le reste dérive, et le décodeur vous dit où.
Les noms marchent — jusqu'à ce qu'on les mette dans une plage
0 0 * * mon passe. 0 0 * * mon-fri n'est pas portable : crontab(5) précise que les noms sont acceptés comme valeurs, mais que « les plages ou listes de noms ne sont pas autorisées ». Vixie cron sur Debian l'accepte quand même, et c'est précisément pour ça que ça mord — la ligne marche sur votre poste et se fait refuser par le cron busybox d'un conteneur.
Même famille que 5/10, qu'aucune version de crontab(5) ne documente : certains parsers y lisent « de 5 à la fin de la plage, tous les 10 », d'autres refusent la ligne. Écrivez 5-59/10. C'est plus moche et ça survit au changement de serveur.
FAQ
Comment lire une expression cron ?
De gauche à droite : minute, heure, jour du mois, mois, jour de semaine. Un * veut dire « toutes les valeurs de ce champ », un chiffre veut dire « celle-là uniquement ». 30 3 * * * : minute 30, heure 3, n'importe quel jour, n'importe quel mois, n'importe quel jour de semaine — soit 03:30 chaque nuit. Les champs sont combinés en ET, sauf les deux champs de jour, en OU quand les deux sont restreints.
Que veut dire */5 * * * * ?
Toutes les 5 minutes : minutes 0, 5, 10 … 55, de chaque heure, tous les jours. C'est l'intervalle le plus court dont la plupart des gens ont réellement besoin, et 5 divise 60 exactement, donc pas de trou au changement d'heure pile. */7 n'a pas cette propriété.
Quel fuseau horaire utilise cron ?
Celui du serveur, ni le vôtre ni UTC — sauf si la crontab déclare CRON_TZ= en tête (Vixie cron) ou si votre distribution l'ignore. La prévisualisation ci-dessus utilise le fuseau du navigateur où vous lisez, ce qui est un bon test de cohérence mais pas une preuve : lancez date sur le serveur pour en avoir le cœur net.
Y a-t-il un champ pour les secondes ?
Pas dans le crontab Linux. Cinq champs, résolution à la minute, point. Les expressions à six champs viennent de Quartz, Spring, node-cron ou croniter — toutes ajoutent les secondes devant. Si vous en collez une ci-dessus, le décodeur vous le dit au lieu de deviner.
Mon cron ne tourne pas alors que l'expression est bonne, pourquoi ?
Parce qu'une expression valide n'est que la première étape. Les suspects habituels : la crontab n'a pas de saut de ligne final, le PATH est quasi vide sous cron donc python est introuvable, le script réclame un TTY, ou l'exécution précédente tient encore un verrou. Cron ne vous préviendra pas — il n'a aucun événement « run manqué ». C'est à ça que sert un heartbeat.
L'expression est bonne. Le job a-t-il tourné ?
Un validateur dit quand une ligne est censée se déclencher. Il ne dira pas que le serveur a redémarré, que le disque était plein ou que le script est mort à 03:31. Ajoutez && curl https://cron-ping.com/p/<token> à la fin de la ligne : si le ping n'arrive pas dans le délai de grâce, vous recevez un mail ou un message Slack.
Plan gratuit : 10 checks, alertes email, historique 7 jours. Sans carte. Hébergé en UE.