Le pire bug de production que j'ai jamais causé était un personnage dans une expression cron Je voulais qu'une sauvegarde de base de données s'exécute tous les soirs à minuit J'ai écrit 0 0 * * * dans ma tête, tapé 0 0 * * 0 dans la crontab, et est passé à autre chose Le travail a couru une fois - le dimanche suivant - et puis plus pendant une semaine J'ai découvert quand j'avais besoin d'une sauvegarde qui n'existait pas Ce seul chiffre égaré a transformé " ; chaque jour" ; en " ; chaque dimanche," ; et rien dans la syntaxe ne m'a prévenu Cron fait exactement ce que vous lui dites, silencieusement, pour toujours.
tl;dr : le Générateur d'expressions cron crée une expression de crontab standard à cinq champs à partir de champs simples ou de préréglages en un clic, l'explique dans une phrase au fur et à mesure que vous tapez et prévisualise les prochaines durées d'exécution en UTC afin que vous puissiez confirmer le calendrier avant qu'il n'atteigne la production. Il s'exécute entièrement dans votre navigateur - pas de compte, pas de téléchargement.
J'ai construit cet outil pour Toolz.dev parce que je n'ai plus jamais voulu engager un planning que je n'avais vérifié que dans ma tête Lire une expression cron en arrière comme un anglais simple et voir les dates réelles qu'il va tirer attrape le 0 -contre- * classe d'erreur instantanément Ce guide traite du fonctionnement de la syntaxe cron, des interactions qui déclenchent presque tout le monde et de la façon d'utiliser le générateur pour produire une expression en laquelle vous pouvez avoir confiance.
Qu'est-ce qu'une expression cron ?
Une expression cron est un planning compact fait de cinq champs séparés par des espaces De gauche à droite ils sont minute, heure, jour du mois, mois, et jour de la semaine La forme à cinq champs est spécifiée par POSIX dans le format d'entrée crontab. Un planificateur - le classique Unix cron daemon, mais aussi les systèmes CI, Kubernetes CronJobs et d'innombrables task runners - lisent l'expression et déclenchent votre travail à chaque instant correspondant à tous les champs.
Chaque champ accepte plus d'un seul nombre Une étoile (en)*) signifie " ; every" ; valeur de ce champ. Une liste comme 1,15,30 signifie plusieurs valeurs spécifiques Une plage comme 1-5 signifie une envergure inclusive Une étape comme */15 signifie " ; chaque quinzième" ; valeur à partir du champ' ;s minimum Vous combinez ceux-ci à travers les cinq champs pour décrire presque n'importe quel horaire récurrent : chaque minute, chaque quart d'heure, les jours de semaine à 8 heures du matin, le premier de chaque mois, le dernier trimestre' ; s jour d'ouverture La puissance est réelle, et la densité aussi - cinq champs peuvent encoder un horaire étonnamment précis, ce qui est exactement pourquoi ils sont faciles à se tromper subtilement.
Voici la disposition des champs utilisée par le générateur, avec la plage valide pour chacun :
| Position | champ de courses | Gamme | notes |
|---|---|---|---|
| 1 | moment | 0–59 | |
| 2 | heure | 0–23 | Horloge de 24 heures |
| 3 | jour du mois | 1–31 | |
| 4 | mois | 112 | JAN–DEC également accepté |
| 5 | jour de la semaine | 06 | 0 et 7 signifient tous deux dimanche ; SUN–SAT accepté |
Pourquoi générer l'expression au lieu de l'écrire à la main
Écrire cron à la main est un pari que vous avez mémorisé l'ordre de champ, les plages, et les interactions correctement, sans retour jusqu'à ce que le travail soit exécuté ou échoue Le générateur remplace ce pari par la confirmation Lorsque vous remplissez les champs il fait trois choses à la fois.
Tout d'abord, il assemble et valide l'expression, en attrapant les valeurs hors de portée, les plages inversées et les étapes mal formées avec un message qui nomme le champ incriminé. Une expression comme 0 25 * * * - l'heure 25 n'existe pas - est rejetée avec une explication plutôt qu'acceptée et ne se déroule jamais silencieusement.
Deuxièmement, cela donne le calendrier sous forme de phrase. 0 8 * * 1-5 devient " ; À 08h00 du lundi au vendredi." ; Lire le planning avec des mots est le moyen le plus rapide de remarquer que ce que vous avez construit n'est pas ce que vous vouliez dire Mon bug de sauvegarde de minuit aurait été évident dès l'instant où j'ai lu " ; À 00h00 le dimanche" ; au lieu de " ; À 00h00." ;
Troisièmement, il prévisualise les temps d'exécution à venir réels Voir qu'une tâche va se déclencher dans trois mois au lieu de ce soir vous dit que quelque chose ne va pas bien plus viscéralement que de regarder les astérisques Cet aperçu attrape également les horaires impossibles - demandez le 30 février et le générateur ne montre aucune course à venir du tout, parce qu'il n'y en a pas.
Comment utiliser le générateur d'expression Cron
Étape 1 : Partez d’une ardoise prédéfinie ou vierge
La voie la plus rapide vers une expression correcte est de partir d'une qui est déjà proche Choisissez un préréglage comme " ; Les jours de semaine à 8 h, " ; " ; Toutes les 15 minutes, " ; ou " ; Premier mois à minuit, " ; et les champs se chargent prêts à s'ajuster Si aucun ne convient, commencez par la valeur par défaut de chaque minute et éditez Les préréglages existent parce que la plupart des plannings réels sont des variations sur une douzaine de motifs courants, et partir d'une expression connue-bonne élimine toute une catégorie d'erreurs.
Étape 2 : Définissez les cinq champs
Entrez une valeur dans chaque champ ou laissez-la sous * pour " ; chaque." ; Chaque champ accepte une seule valeur, une liste de virgules, une plage de traits d'union ou un pas de barre oblique Par exemple, pour fonctionner en haut de chaque heure pendant les heures de bureau en semaine, réglez la minute sur 0, heure à 9-17et jour de la semaine à 1-5, laissant le jour du mois et le mois comme *. L'indice sous chaque champ vous rappelle sa plage valide afin que vous n'ayez pas à mémoriser la commande.
Étape 3 : Lisez la description en anglais simple
Regardez la mise à jour de la description pendant que vous tapez C'est l'étape qui vous sauve Si la phrase ne correspond pas au calendrier dans votre tête, l'expression est fausse, et vous avez découvert dans le navigateur au lieu d'être en production une semaine plus tard Confirmez l'heure, les jours, et toute restriction de mois lire comme vous l'entendez.
Étape 4 : Vérifiez les prochaines exécutions et copiez
Cliquez pour prévisualiser les heures d'exécution à venir, calculées en UTC. Analysez-les pour tout ce qui est surprenant - un intervalle trop long, une première exécution trop éloignée ou une liste vide signalant une date impossible. Lorsque le calendrier semble correct, copiez l'expression et collez-la dans votre crontab, pipeline ou manifeste CronJob.
Le piège du jour du mois et du jour de la semaine
Si vous vous souvenez d'une chose à propos de cron, faites-le ceci, car cela surprend presque tout le monde la première fois Quand l'un et le champ jour du mois et le champ jour de la semaine sont restreints, ce qui signifie qu'aucun des deux ne l'est * - cron standard les combine avec OR, pas AND. Le travail fonctionne quand n'importe lequel condition correspond.
Donc 0 0 13 * 5 ne signifie pas " ; minuit le vendredi 13." ; Cela signifie " ; minuit le 13 de chaque mois, et aussi minuit tous les vendredis." ; Ce sont des horaires très différents ; le deuxième s'allume plusieurs fois par mois Ce comportement vient tout droit de l'implémentation originale de Vixie cron dont la plupart des planificateurs héritent, et le générateur l'honore exactement Son aperçu de la prochaine diffusion vous montrera à la fois les 13 et les vendredis, ce qui est le moyen le plus clair possible d'attraper un OR involontaire.
La règle pratique : laisser un des deux champs de jour comme * sauf si vous voulez vraiment le comportement OU. Si vous avez vraiment besoin de " ; Vendredi 13 seulement, " ; cron ne peut pas l'exprimer en une seule expression - vous gérez cette logique dans votre travail. Voir les dates d'exécution réelles dans l'aperçu est ce qui transforme cela d'un gotcha caché en un fait évident et visible.
Étapes, plages et listes en pratique
La syntaxe des étapes est celle où vit une grande partie de la puissance de planification et où commence une grande confusion. */5 dans le champ des minutes signifie les minutes 0, 5, 10, 15, et ainsi de suite jusqu'à 55 - " ; toutes les cinq minutes." ; Vous pouvez ancrer une étape à une plage : 0-30/10 signifie minutes 0, 10, 20 et 30 uniquement. Une valeur nue avec un pas, comme 5/15 dans le champ des minutes, signifie " ; commençant à 5, tous les 15" ; jusqu'au champ maximum - 5, 20, 35, 50.
Listes et gammes se combinent librement. 1,4,7,10 dans le champ mois vous donne un horaire trimestriel - janvier, avril, juillet, octobre. 1-5 le jour de la semaine, on vous donne du lundi au vendredi. 9-17 dans le champ des heures vous donne une fenêtre de neuf à cinq. en les mélangeant, 0 9-17 * * 1-5 se lit comme " ; à la minute 0 de chaque heure de 9h à 17h, du lundi au vendredi et quot ; - un rythme cardiaque courant pendant les heures ouvrables. Le générateur étend et valide tout cela, et la description précise ce que vous avez construit afin qu'il n'y ait aucune ambiguïté quant, par exemple, si une plage est inclusive (c'est le cas).
Cas d'utilisation courants
Sauvegardes et maintenance planifiées. Le job canonique cron. Générer 0 2 * * * pour une sauvegarde nocturne 2 h du matin, lisez la description pour confirmer qu'elle est quotidienne et non hebdomadaire, et prévisualisez les prochaines exécutions pour être sûr que la première est ce soir C'est l'erreur exacte que j'ai faite il y a des années, et celle exacte que l'aperçu empêche.
CI et calendriers de déploiement. Les builds nocturnes, les tests programmés et les déploiements périodiques utilisent tous la syntaxe cron dans GitHub Actions, GitLab CI et les systèmes similaires Construisez l'expression ici, confirmez-la et collez-la dans votre fichier de flux de travail Parce que ces systèmes s'exécutent sur leurs propres serveurs, notez la mise en garde du fuseau horaire ci-dessous.
Pipelines de données et rapports. Un rapport hebdomadaire tous les lundis à 6h est 0 6 * * 1; un rollup mensuel sur le premier est 0 0 1 * *; un emploi trimestriel est 0 0 1 1,4,7,10 *. Les générer et les lire arrête le classique " ; a couru le mauvais jour" ; incident de pipeline.
Réchauffement de cache et battements de cœur. Des emplois à haute fréquence comme */5 * * * * gardez les caches au chaud ou les contrôles de santé à tic-tac L'aperçu confirme que l'intervalle est ce à quoi vous vous attendez plutôt que, disons, une fois par heure parce que vous mettez le pas dans le mauvais champ.
Cron d'apprentissage. Si vous construisez encore l'intuition, le générateur est un outil d'enseignement Tapez une expression, lisez la phrase, voyez les courses, et le mappage entre syntaxe et comportement devient concret d'une manière que la documentation seule ne gère jamais.
Une note sur les fuseaux horaires
L'aperçu de l'exécution suivante calcule les heures dans UTC donc le résultat est déterministe et identique pour tous ceux qui lisent ceci, Les démons cron réels, cependant, s'exécutent dans le serveur' ; son fuseau horaire local sauf configuration contraire, et les fournisseurs CI ont chacun leur propre convention - beaucoup font défaut à UTC, d'autres non. L'expression elle-même ne porte aucun fuseau horaire ; c'est le planificateur qui décide Ainsi, lorsque vous déplacez une expression de cet outil vers un système en direct, confirmez que system' ; est le fuseau horaire et compense les temps d'exécution dans votre tête en conséquence. A 0 0 * * * le travail est minuit - mais minuit alors que dépend entièrement de l'endroit où le travail s'exécute Si vous devez raisonner sur les décalages de fuseau horaire, le convertisseur timezone est pratique, et le convertisseur d'horodatage aide lorsque vos journaux de planification s'exécutent sous forme d'horodatages Unix.
Générer ou analyser une expression
Cet outil construit une expression à partir de champs Son frère, le Analyseur d'expression cron[TRADUCTION], va dans l'autre sens : collez une expression existante et elle l'explique et prévisualise ses exécutions Les deux couvrent les deux directions d'un même problème Utilisez le générateur lorsque vous connaissez le planning que vous voulez et avez besoin de la syntaxe ; utilisez l'analyseur lorsque vous avez hérité d'une expression et que vous devez comprendre ce qu'elle fait Les deux honorent la même sémantique Vixie-cron, y compris la règle du jour du mois OU du jour de la semaine, de sorte que la description que vous lisez dans l'un correspond au comportement que vous verriez dans l'autre Ensemble, ils constituent une petite paire ciblée au sein du kit plus large que je décris dans le Boîte à outils pour les développeurs Web aperçu et plus large Guide des outils de codage.
Confidentialité : tout s'exécute dans votre navigateur
Il n'y a rien à télécharger ici, et rien n'est téléchargé L'expression est construite, validée, décrite, et simulée entièrement en code côté client Cela compte plus qu'il n'y paraît : les plannings internes des emplois peuvent révéler des choses sur un système' ; s architecture et cadence dont vous ne voudriez pas vous asseoir dans un tiers' ; s logs. Vous pouvez confirmer que l'outil est autonome en se déconnectant d'internet - il continue de fonctionner C'est le même principe côté client derrière chaque outil sur Toolz.dev, pour lequel je fais valoir tous les arguments dans le Confidentialité des données dans les outils en ligne article.
FAQ
Comment écrire une expression cron ?
Une expression standard de cron a cinq champs séparés par des espaces : minute, heure, jour du mois, mois et jour de la semaine Chaque champ est une valeur spécifique, une liste, une plage, un pas, ou * pour chaque. Par exemple, 0 8 * * 1-5 signifie à 08h00 du lundi au vendredi Cet outil construit l'expression pour vous et montre ce que cela signifie au fur et à mesure.
Que signifient les cinq champs de cron ?
De gauche à droite, ils sont minute (059), heure (023), jour du mois (131), mois (112), et jour de la semaine (06, où 0 et 7 signifient tous deux dimanche).Une étoile dans un champ signifie " ; chaque" ; valeur de ce champ L'outil étiquette chaque champ afin que vous n'ayez pas à vous souvenir de l'ordre.
Qu'est-ce que */5 je veux dire en cron ?
La barre oblique introduit une valeur de pas Dans le champ des minutes, */5 signifie " ; toutes les 5 minutes" ; - 0, 5, 10, 15, et ainsi de suite Vous pouvez combiner des étapes avec des plages aussi : 0-30/10 dans le champ des minutes signifie les minutes 0, 10, 20 et 30. Les étapes sont le moyen standard d'exprimer " ; chaque unité N." ;
Pourquoi mon travail est-il plus souvent que prévu avec le jour du mois et le jour de la semaine ?
C'est la surprise de cron la plus courante Lorsque les champs jour-du-mois et jour-de-la-semaine sont restreints (aucun des deux ne l'est *), cron standard les traite comme OU, pas ET - le travail s'exécute lorsque l'une ou l'autre des conditions correspond. Donc 0 0 13 * 5 court le 13 du mois et tous les vendredis, pas seulement le vendredi 13. Laisser un champ comme * à moins que vous ne vouliez vraiment le comportement du bloc opératoire.
Dans quel fuseau horaire les prochains temps d'exécution sont-ils indiqués ?
L'aperçu calcule les prochaines exécutions en UTC afin que le résultat soit le même pour tout le monde. Les vrais démons cron utilisent le fuseau horaire du serveur (ou un paramètre TZ), donc si votre serveur s'exécute dans une zone différente, comparez les temps en conséquence. L'expression elle-même ne porte aucun fuseau horaire - c'est le planificateur qui décide.
Puis-je utiliser des noms comme le lundi ou le janvier au lieu des chiffres ?
Oui. Le champ des mois accepte JAN par DEC et le champ jour de la semaine accepte SUN par SAT[TRADUCTION], insensible à la casse L'outil les comprend lorsqu'il valide et décrit votre expression Les valeurs numériques sont plus portables dans les planificateurs, de sorte que le générateur émet des numéros, mais l'entrée nommée est entièrement prise en charge.
Est-ce la même chose que la syntaxe crontab ?
Oui, cela génère un cron Unix/Vixie standard à cinq champs utilisé par crontab, la plupart des systèmes CI et Kubernetes CronJobs. Certains planificateurs ajoutent un champ de sixième seconde ou des extensions non standard comme @reboot; ceux-ci ne font pas partie de la norme à cinq champs Pour la grande majorité des besoins de planification, l'expression à cinq champs produite par cet outil est exactement ce que vous voulez.
Mon emploi du temps est-il envoyé quelque part ?
Non. L'expression est construite, validée, décrite et simulée entièrement dans votre navigateur avec un code côté client Rien n'est téléchargé ou stocké Vous pouvez le confirmer en vous déconnectant d'Internet - le générateur fonctionne toujours.



