aller au contenu principal

-- Décortiquez une expression cron champ par champ et voyez ses cinq prochaines exécutions --
temps de lecture : 4 minutes566 mots

-- les champs sont interprétés en UTC, comme le font cron, GitHub Actions et Vercel --

expression valide
minute
à 0
heure
à 9
jour du mois
toutes les valeurs
mois
toutes les valeurs
jour de la semaine
à 1, 2, 3, 4, 5

    Utilisation #

    Saisissez une expression à cinq champs. L'outil valide chaque champ, indique lequel pose problème le cas échéant, et calcule les cinq prochaines exécutions.

    Les cinq champs #

    ┌───────────── minute (0-59)
    │ ┌─────────── heure (0-23)
    │ │ ┌───────── jour du mois (1-31)
    │ │ │ ┌─────── mois (1-12 ou JAN-DEC)
    │ │ │ │ ┌───── jour de la semaine (0-6 ou SUN-SAT, 0 = dimanche)
    │ │ │ │ │
    * * * * *
    
    SyntaxeSens
    *toutes les valeurs
    5uniquement 5
    1-5de 1 à 5 inclus
    */15toutes les 15 unités, à partir du min
    5/10à partir de 5, puis tous les 10
    1,15,30ces valeurs précisément

    7 est accepté comme alias de dimanche, en plus de 0 : crontab(5) le documente explicitement.

    Le piège du jour du mois et du jour de la semaine #

    C'est la source de bug des expressions cron. Quand les deux champs de jour sont restreints — ni l'un ni l'autre à * — cron déclenche dès que l'un des deux correspond, pas quand les deux correspondent.

    0 0 1 * 1
    

    On lit volontiers « le premier lundi du mois ». En réalité : tous les lundis, et en plus le 1er de chaque mois. Pour obtenir un premier lundi, il faut tester la date dans le script lui-même :

    # le 1er lundi du mois : cron déclenche tous les lundis, le script filtre
    0 0 * * 1 [ "$(date +%d)" -le 07 ] && /usr/local/bin/mon-script

    Dès qu'un seul des deux champs est restreint, la règle redevient intuitive : 0 9 * * 1-5 signifie bien « à 9 h, du lundi au vendredi ».

    Fuseau horaire #

    Cet outil interprète les champs en UTC, comme cron système, GitHub Actions et Vercel. Un ordonnanceur qui interprète en heure locale pose deux questions sans bonne réponse : au passage à l'heure d'été, une tâche à 02:30 n'existe pas ; au passage à l'heure d'hiver, elle existe deux fois.

    D'où une règle simple : planifiez en UTC et convertissez à l'affichage. Une tâche à 9 h heure de Paris se planifie à 0 8 * * * l'hiver et 0 7 * * * l'été — ou, mieux, se planifie à une heure où le décalage n'a pas d'importance.

    Expressions valides qui ne se déclenchent jamais #

    0 0 30 2 *
    

    Le 30 février est syntaxiquement correct et n'arrivera jamais. L'outil le détecte et le dit, au lieu de chercher indéfiniment.

    0 0 29 2 * est plus subtile : elle se déclenche, mais seulement les années bissextiles — donc une fois tous les quatre ans.

    Vérifier un cron dans un projet #

    // GitHub Actions : les minutes exactes sont déconseillées, le planificateur
    // est surchargé à :00 et peut décaler de plusieurs minutes
    on:
      schedule:
        - cron: "17 3 * * *" // plutôt que "0 3 * * *"

    Un cron GitHub Actions n'est pas garanti à la minute : c'est une file d'attente partagée. Pour une tâche qui doit vraiment partir à l'heure, il faut un ordonnanceur dédié.

    sujets abordés

    à lire aussi