Cron-Ping

Validateur d'expression cron : que fait vraiment cette ligne ?

Dernière mise à jour : juillet 2026 · Par Yohann Kipfer, Cron-Ping

En résumé

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-5

Collez 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.

Décoder une expression cron

Tout se calcule dans votre navigateur. Rien n'est envoyé, aucun compte.

Décomposition champ par champ de l'expression
ChampVous avez écritCorrespond à
minute*/50, 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
Rien à signaler. Les champs sont sans ambiguïté, les pas tombent juste, et cette ligne veut dire la même chose sur toutes les implémentations de cron.
5 prochaines exécutions

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.

Les cinq champs crontab, leur plage et ce qu'ils acceptent
ChampPlageRemarques
minute0-59Le seul champ sans raccourci. */1 et * sont identiques.
heure0-23Horloge 24 h, dans le fuseau du serveur — pas le vôtre. 0 = minuit.
jour du mois1-31Un 31 saute février, avril, juin, septembre et novembre, sans rien dire.
mois1-12jan-dec acceptés comme valeurs simples (* * * jul *), pas dans une plage.
jour de semaine0-70 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à.

Les opérateurs cron, leur sens et un exemple
SyntaxeSensExemple
*toutes les valeurs du champ* * * * * — chaque minute
5exactement cette valeur5 * * * * — à la minute 5 de chaque heure
1,15,30une liste de valeurs0 1,13 * * * — à 01:00 et 13:00
1-5une plage, bornes incluses0 9 * * 1-5 — 09:00 du lundi au vendredi
*/10toutes les n valeurs, depuis le début de la plage*/10 * * * * — à :00, :10, :20 …
0-30/10un pas dans une plage0-30/10 * * * * — à :00, :10, :20, :30 seulement
jul, friun nom à la place d'un chiffre0 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 13

Cette 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.

Créer un check gratuit

Plan gratuit : 10 checks, alertes email, historique 7 jours. Sans carte. Hébergé en UE.

À lire ensuite

Cron toutes les 5 minutes : construire la ligneL'autre moitié : les flags curl, l'échappement des `%`, flock, et un builder qui sort la ligne complète.Surveiller un cron Linux qui ne tourne plusVérifier crond, lire le mail, repérer une crontab écrasée.Documentation Cron-PingPings de succès, de start et de fail, capture des logs, exemples curl/wget/Python.Une alternative européenne à Healthchecks.ioCe qu'on fait différemment, et quand Healthchecks.io auto-hébergé est le meilleur choix.

Sources