Français

Outils de développement · Générateur Crontab

Jour du mois vs jour de la semaine dans cron : la règle OU qui surprend tout le monde

· Comment ça marche

cron Calendrier Planification planification

Deux filtres de calendrier réunis via une porte OU en un seul calendrier
Illustration vectorielle originale de ToolAcre

Lorsque les deux champs de jour sont restreints, cron exécute la tâche si l'un ou l'autre correspond. Cet article explique la règle de crontab(5), pourquoi elle existe et comment obtenir les planifications qu'elle empêche.

Le rapport a été publié le 1er et tous les lundis — l'expression 0 9 1 * 1 ne veut pas dire à quoi elle ressemble

Une expression telle que `0 9 1 * 1` ressemble à « 09:00 le premier lundi » si les colonnes des deux jours sont lues comme des filtres cumulatifs. ToolAcre ne le lit pas de cette façon. Avec le jour du mois défini sur 1 et le jour de la semaine défini sur lundi, l'analyseur avertit que l'une ou l'autre condition peut correspondre, de sorte que la planification inclut chaque premier et chaque lundi.

Il ne s'agit pas d'une préférence de formulation mineure. Un rapport mensuel peut être exécuté quatre ou cinq fois supplémentaires, et une opération prévue uniquement le lundi peut également être exécutée le premier du mois. Le générateur place un avertissement « À vérifier » à côté de la description afin que le comportement développé soit visible avant qu'une expression ne soit copiée dans une crontab externe.

La règle telle qu'écrite : si le jour du mois et le jour de la semaine sont restreints, la commande s'exécute lorsque l'un ou l'autre des champs correspond

La fonction `dayMatches` de l'implémentation gère explicitement quatre cas. Deux caractères génériques acceptent chaque date ; un jour du mois générique est reporté au jour de la semaine ; un jour de semaine générique est reporté au jour du mois ; et deux champs restreints renvoient le OU logique de leurs correspondances. Les tests couvrent une date correspondant uniquement au treizième, uniquement au vendredi et aucune des deux conditions.

Les descriptions conservent la même règle. `0 0 13 * 5` est rendu par « le 13 du mois ou le vendredi », et non une conjonction ambiguë. L'analyse, la sélection de la prochaine exécution et la sortie en anglais utilisent toutes la même interprétation. Ce comportement partagé est une preuve plus solide qu'une étiquette d'aide isolée, car un désaccord entre ces chemins créerait immédiatement des aperçus trompeurs.

L'analyseur implémente OR et expose la conséquence ; il n’établit pas l’historique de la règle

Le plan du classeur offrait une raison historique pour la conception de la salle d'opération, mais ce référentiel prouve le comportement plutôt que la provenance. Les commentaires du code identifient une règle de style Vixie, et les tests établissent le résultat modélisé par ToolAcre. Ils ne précisent pas qui a choisi la règle, quand elle a été adoptée ni pourquoi une interprétation permissive a été préférée.

Garder cette limite est important dans la rédaction technique. Les lecteurs doivent savoir exactement comment cet outil élargit l'expression ; ils n’ont pas besoin d’un récit de normes inventé pour l’utiliser en toute sécurité. Si une cible de déploiement documente une sémantique de jour différente, son propre manuel surpasse cet aperçu du navigateur. ToolAcre indique le dialecte qu'il calcule plutôt que de prétendre que tous les planificateurs sont d'accord.

Exemple concret : énumérer 0 9 1 * 1 pendant un mois — les jours de déclenchement, par rapport au calendrier souhaité par l'auteur

Considérons un mois dont le premier jour n'est pas le lundi. `0 9 1 * 1` produit une exécution lors de la première exécution et des exécutions supplémentaires chaque lundi. Si la première date est lundi, cette date apparaît toujours une fois, car la recherche suivante prend en compte une minute calendaire et non deux déclencheurs distincts. Le syndicat change en taille avec le calendrier mais pas en logique.

Vous pouvez inspecter cette union en choisissant un fuseau horaire et en lisant les cinq prochaines courses. L'aperçu commence strictement après l'instant actuel et recherche les dates du calendrier, en appliquant les champs mois, jour et heure. Il ne promet pas de mois spécifique dans la prose de l'article, car la liste en direct dépend du moment et de l'endroit où le lecteur effectue la vérification.

Les solutions de contournement des commandes du premier lundi de style AND se trouvent en dehors de ce générateur de planification

Le plan suggérait d'intégrer un test de date shell pour obtenir le comportement ET. ToolAcre ne peut pas vérifier une telle commande : il n'accepte que les cinq champs de planification et sa ligne complète copiée contient un exécutable d'espace réservé. La syntaxe du shell, le pourcentage d'échappement, la disponibilité des commandes et le comportement de sortie appartiennent tous à l'environnement qui exécute finalement le travail.

Dans ce générateur, la solution de conception sûre consiste à laisser un champ d'un jour comme `*` à moins que l'union OR ne soit véritablement prévue. Pour une exigence du premier lundi, documentez que le cron à cinq champs à lui seul n'exprime pas l'intersection dans ce dialecte. Choisissez et testez séparément une solution spécifique à l'environnement au lieu de présenter un extrait non exécuté comme garanti.

Les autres opérateurs du planificateur ne sont pas interprétés par cet analyseur à cinq champs

Certaines grammaires du planificateur exposent des opérateurs tels que `#`, `L`, `W` ou `?`, mais cet analyseur n'en accepte aucun. Il refuse également six champs et explique que son contrat est une syntaxe crontab à cinq champs. Par conséquent, une expression qui fonctionne dans un autre produit ne peut pas être collée ici pour prouver que la même règle de calendrier existe.

La traduction dialectale commence par identifier les grammaires source et cible, et non par la suppression de la ponctuation jusqu'à ce que la validation réussisse. ToolAcre peut aider à construire les cinq champs ordinaires, noms, plages, listes et étapes de la cible. Il ne peut pas préserver la sémantique portée par un opérateur non pris en charge, et les articles évitent délibérément de décrire ces opérateurs étrangers comme s'ils étaient implémentés.

L'échappement des commandes est en dehors de la grammaire des expressions uniquement

Les panneaux de pourcentage et les citations de commandes apparaissent après le calendrier et se trouvent à l'extérieur de `parseCron`. L'analyseur divise une expression en exactement cinq parties séparées par des espaces ; il ne lit jamais un pipeline shell, une commande de date ou une charge utile de commande échappée. Par conséquent, cet article n’enseigne pas de solution de contournement basée sur le signe pourcentage, même si le manuel en propose une.

Cette omission est une décision relative au bien-fondé. Un outil de planification ne doit pas impliquer qu'une commande est sûre car ses champs de synchronisation sont validés. Passez en revue la syntaxe des commandes dans l'implémentation et le shell réels de cron, avec des entrées inoffensives et une sortie observable. Gardez le résultat du générateur limité à la règle de calendrier qu'il comprend manifestement.

À retenir : limitez le champ à un jour, pas les deux – et l'explication du générateur rend le OU visible avant d'enregistrer la ligne

Lorsque les deux champs de jour sont restreints, lisez-les comme une union et dites « ou » à voix haute. Mieux encore, inspectez l’avertissement du générateur et les courses à venir. Si ces dates dépassent la date prévue, renvoyez un champ à `*` et résolvez toute exigence plus spécialisée avec un mécanisme documenté par l'environnement cible.

La leçon principale n'est pas que cron soit mystérieux ; c'est que deux colonnes adjacentes ne se combinent pas comme les autres restrictions. ToolAcre centralise cette exception dans la logique d'analyse, de description et d'aperçu. Utilisez ces trois vues pour détecter l'inadéquation avant qu'une expression ne quitte le navigateur et ne devienne une planification opérationnelle.