De ergste productiebug die ik ooit heb veroorzaakt was één personage in een cron-expressie Ik wilde dat er elke avond om middernacht een database-back-up zou draaien Ik schreef 0 0 * * * in mijn hoofd, getypt 0 0 * * 0 de crontab in, en verder De baan liep één keer - de volgende zondag - en daarna een week niet meer Ik kwam erachter toen ik een back-up nodig had die niet bestond Dat ene misplaatste cijfer veranderde & quot; elke dag" in & quot; elke zondag, & quot; en niets in de syntaxis waarschuwde me Cron doet precies wat je het vertelt, stil, voor altijd.
tl;dr: de Cron-expressiegenerator bouwt een standaard crontab-expressie met vijf velden op vanuit gewone velden of voorinstellingen met één klik, legt deze uit in een zin terwijl u typt en geeft een voorbeeld van de volgende looptijden in UTC, zodat u het schema kunt bevestigen voordat het in productie gaat Het draait volledig in uw browser - geen account, geen upload.
Ik heb deze tool gebouwd voor Toolz.dev omdat ik nooit meer een schema wilde vastleggen dat ik alleen in mijn hoofd had gecontroleerd. Een cron-expressie teruglezen als gewoon Engels en de werkelijke data zien waarop het zal vuren, vangt de 0 -versus- * klasse van fouten onmiddellijk Deze handleiding behandelt hoe de syntaxis van cron werkt, de interacties die bijna iedereen doen struikelen en hoe u de generator kunt gebruiken om een expressie te produceren waarop u kunt vertrouwen.
Wat is een cron-uitdrukking?
Een cron-expressie is een compact schema dat bestaat uit vijf velden gescheiden door spaties Van links naar rechts zijn ze minuut, uur, dag van maand, maand en dag van week De vorm met vijf velden wordt door POSIX gespecificeerd in de crontab-invoerformaat. Een planner - de klassieke Unix cron daemon, maar ook CI-systemen, Kubernetes CronJobs, en talloze taaklopers - lezen de uitdrukking en ontslaan je baan op elk moment dat bij alle velden past.
Elk veld accepteert meer dan een enkel getal Een ster (*) betekent "every" waarde van dat veld Een lijst als 1,15,30 betekent meerdere specifieke waarden Een bereik zoals 1-5 betekent een inclusieve span. Een stap als */15 betekent "elke vijftiende" waarde beginnend bij het veld's minimum U combineert deze over de vijf velden om bijna elk terugkerend schema te beschrijven: elke minuut, elk kwartier, weekdagen om 8 uur, de eerste van elke maand, het laatste kwartaal' s openingsdag De macht is reëel, en de dichtheid ook - vijf velden kunnen een verrassend nauwkeurig schema coderen, en dat is precies de reden waarom ze gemakkelijk subtiel verkeerd te krijgen zijn.
Hier is de veldindeling die de generator gebruikt, met voor elk het geldige bereik
| Position | veld | Bereik | vastleggen |
|---|---|---|---|
| 1 | stimus | 0-59 | |
| 2 | stond | 0-23 | 24-uursklok |
| 3 | dag van de maand | 1-31 | |
| 4 | maandverlangen | 1-12 | JANtentamenDEC ook geaccepteerd |
| 5 | dag van de week | 0-6 | 0 en 7 betekenen beide zondag; SUNtentamenSAT geaccepteerd |
Waarom de uitdrukking genereren in plaats van deze met de hand te schrijven
Cron met de hand schrijven is een weddenschap dat je de veldvolgorde, de bereiken en de interacties correct hebt onthouden, zonder feedback totdat de taak wordt uitgevoerd of mislukt. De generator vervangt die weddenschap door bevestiging. Terwijl je de velden invult, doet hij drie dingen tegelijk.
Ten eerste, het assembleert en valideert de uitdrukking, het vangen van out-of-range waarden, omgekeerde bereiken, en verkeerd opgemaakte stappen met een bericht dat de naam van het overtredende veld Een uitdrukking als 0 25 * * * - uur 25 bestaat niet - wordt afgewezen met een uitleg in plaats van geaccepteerd en wordt in stilte nooit uitgevoerd.
Ten tweede wordt het schema als een zin weergegeven. 0 8 * * 1-5 wordt " Om 08:00 van maandag tot en met vrijdag." Het lezen van het schema in woorden is de snelste manier om op te merken dat wat je hebt gebouwd niet is wat je bedoelde Mijn midnight-back-up bug zou duidelijk zijn geweest op het moment dat ik " Om 00:00 op zondag" in plaats van " Om 00:00."
Ten derde geeft het een voorproefje van de daadwerkelijke komende looptijden. Als je ziet dat een baan over drie maanden zal ontbranden in plaats van vanavond, dan is er veel diepgaander iets mis dan naar sterretjes te staren. Deze voorvertoning bevat ook onmogelijke schema's - vraag naar 30 februari en de generator laat helemaal geen aankomende runs zien, want die zijn er niet.
Hoe de Cron Expression Generator te gebruiken
Stap 1: Begin vanaf een voorinstelling of een lege lei
De snelste route naar een juiste expressie is om te starten vanaf een die al dichtbij is Kies een voorinstelling zoals & quot; Weekdagen om 8 uur 's ochtends, & quot; Elke 15 minuten, & quot; of & quot; Eerste van de maand om middernacht, & quot; en de velden laden klaar om aan te passen Als er niets past, begin dan vanaf de standaard van elke minuut en bewerk ze omlaag Presets bestaan omdat de meeste echte schema's variaties zijn op een tiental veel voorkomende patronen, en uitgaande van een bekende goede uitdrukking elimineert een hele categorie fouten.
Stap 2: Stel de vijf velden in
Voer in elk veld een waarde in, of laat deze als * voor "elke." Elk veld accepteert een enkele waarde, een kommalijst, een koppeltekenbereik of een schuine streepstap. Om bijvoorbeeld tijdens kantooruren op weekdagen bovenaan elk uur te draaien, stel je de minuut in op 0, uur tot 9-17, en dag van de week tot 1-5, waarbij dag van maand en maand overblijft als *. De hint onder elk veld herinnert u aan het geldige bereik, zodat u de bestelling niet hoeft te onthouden.
Stap 3: Lees de duidelijke Engelse beschrijving
Bekijk de beschrijving update terwijl u typt Dit is de stap die u opslaat Als de zin niet overeenkomt met het schema in uw hoofd, is de uitdrukking verkeerd, en u hebt ontdekt in de browser in plaats van in productie een week later Bevestig de tijd, de dagen en elke maand beperking lees zoals u van plan bent.
Stap 4: Controleer de volgende runs en kopieer
Klik om een voorbeeld te bekijken van de komende looptijden, berekend in UTC. Scan ze op alles wat verrassend is: een gat dat te lang is, een eerste run die te ver weg is, of een lege lijst die een onmogelijke datum aangeeft. Wanneer het schema er goed uitziet, kopieer dan de expressie en plak deze in uw crontab, pijplijn of CronJob-manifest.
De val op dag van de maand en op dag van de week
Als je je één ding over cron herinnert, maak er dan dit van, want het verrast bijna iedereen de eerste keer Wanneer allebei het veld voor de dag van de maand en het veld voor de dag van de week zijn beperkt, wat betekent dat geen van beide dat is * - standaard cron combineert ze met OR, niet EN. De taak loopt wanneer een van beide conditie komt overeen.
Dus 0 0 13 * 5 betekent niet & quot; middernacht op vrijdag de 13e." Het betekent & quot; middernacht op de 13e van elke maand, en ook middernacht op elke vrijdag." Dat zijn heel verschillende schema's; de tweede vuurt vele malen per maand Dit gedrag komt rechtstreeks voort uit de originele Vixie cron-implementatie die de meeste planners erven, en de generator eert het precies. De volgende preview laat je zowel de 13e als de vrijdag zien, wat de duidelijkst mogelijke manier is om een onbedoelde OR te vangen.
De praktische regel: laat een van de twee dagvelden als * tenzij je echt het OK gedrag wilt Als je echt & quot; alleen vrijdag de 13e nodig hebt, & quot; cron kan het niet in één uitdrukking uitdrukken - je behandelt die logica in je werk Het zien van de werkelijke run data in de preview is wat dit van een op de loer liggend gotcha in een voor de hand liggend, zichtbaar feit verandert.
Stappen, bereiken en lijsten in de praktijk
De stapsyntaxis is waar veel planningskracht leeft en waar veel verwarring begint. */5 in het minutenveld betekent minuten 0, 5, 10, 15, enzovoort tot 55 - & quot; elke vijf minuten." U kunt een stap verankeren op een bereik: 0-30/10 betekent alleen minuten 0, 10, 20 en 30. Een kale waarde met een stap, zoals 5/15 in het veld minuten betekent " beginnend bij 5, elke 15" tot het veldmaximum - 5, 20, 35, 50.
Lijsten en bereiken combineren vrij. 1,4,7,10 in het maandveld geeft u een kwartaalschema - januari, april, juli, oktober. 1-5 op dag van de week krijgt u van maandag tot en met vrijdag. 9-17 in het uurveld krijg je een venster van negen tot vijf Ze mengen, 0 9-17 * * 1-5 leest als " op minuut 0 van elk uur van 9.00 tot 17.00 uur, van maandag tot en met vrijdag" - een gebruikelijke hartslag tijdens kantooruren. De generator breidt deze allemaal uit en valideert ze, en de beschrijving beschrijft wat u hebt gebouwd, zodat er geen dubbelzinnigheid bestaat over bijvoorbeeld of een bereik inclusief is (dat is het wel).
Veelvoorkomende gebruiksgevallen
Geplande back-ups en onderhoud. De canonieke cron job Genereer 0 2 * * * voor een nachtelijke back-up om 02.00 uur leest u de beschrijving om te bevestigen dat deze dagelijks is en niet wekelijks, en geeft u een voorbeeld van de volgende runs om er zeker van te zijn dat de eerste vanavond is. Dit is precies de fout die ik jaren geleden heb gemaakt, en precies de fout die de preview verhindert.
CI en inzetschema's. Nachtelijke builds, geplande testruns en periodieke implementaties gebruiken allemaal de cron-syntaxis in GitHub Actions, GitLab CI en soortgelijke systemen Bouw de expressie hier, bevestig deze en plak deze in uw workflowbestand. Omdat deze systemen op hun eigen servers draaien, noteer dan het onderstaande tijdzone-voorbehoud.
Datapijpleidingen en rapporten. Elke maandag om 6 uur is er een wekelijkse rapportage 0 6 * * 1; een maandelijkse rollup op de eerste is 0 0 1 * *; een kwartaalbaan is 0 0 1 1,4,7,10 *. Door deze te genereren en terug te lezen, stopt de klassieke & quot; op de verkeerde dag en quot; pijplijnincident.
Cache opwarming en hartslagen. Hoogfrequente banen zoals */5 * * * * houd caches warm of gezondheidscontroles tikken De preview bevestigt dat het interval is wat je verwacht in plaats van, zeg, één keer per uur omdat je de stap in het verkeerde veld zet.
Leercron. Als je nog steeds intuïtie opbouwt, is de generator een leermiddel Typ een uitdrukking, lees de zin, zie de runs, en de mapping tussen syntaxis en gedrag wordt concreet op een manier die documentatie alleen nooit beheert.
Een opmerking over tijdzones
De volgende-run preview berekent tijden in UTC dus het resultaat is deterministisch en hetzelfde voor iedereen die dit leest Echte cron daemons draaien echter in de server' s lokale tijdzone tenzij anders geconfigureerd, en CI providers hebben elk hun eigen conventie - veel standaard naar UTC, sommige niet De expressie zelf draagt geen tijdzone; het is de planner die beslist Dus wanneer u een expressie van deze tool naar een live systeem verplaatst, bevestig dan dat system' tijdzone en compenseer de looptijden in uw hoofd dienovereenkomstig A 0 0 * * * de baan is middernacht, maar middernacht waarheen ook hangt volledig af van waar de taak loopt Als je moet redeneren over tijdzone-offsets, de tijdzone converter is handig, en de timestamp converter helpt wanneer uw plannerlogboeken worden uitgevoerd als Unix-tijdstempels.
Een expressie genereren versus parseren
Deze tool bouwt een uitdrukking op uit velden. Zijn broer of zus, de Cron-uitdrukkingsparer, gaat de andere kant op: plak een bestaande uitdrukking en het legt het uit en geeft een voorbeeld van de runs ervan De twee dekken de twee richtingen van hetzelfde probleem Gebruik de generator wanneer je het gewenste schema kent en de syntaxis nodig hebt; gebruik de parser wanneer je een expressie hebt geërfd en moet begrijpen wat het doet Beide eren dezelfde Vixie-cron semantiek, inclusief de dag-van-maand OF dag-van-week regel, dus de beschrijving die je in de ene leest komt overeen met het gedrag dat je in de andere zou zien Samen zijn ze een klein, gericht paar binnen de bredere kit die ik in de Webontwikkelaar Toolkit overzicht en het bredere Handleiding voor coderingshulpmiddelen.
Privacy: het draait allemaal in je browser
Er is hier niets te uploaden, en er wordt niets geüpload De expressie is volledig gebouwd, gevalideerd, beschreven, en gesimuleerd in client-side code Dat doet er meer toe dan het lijkt: interne taakschema's kunnen dingen onthullen over een systeem' s architectuur en cadans die je niet zou willen zitten in een third party' s logs U kunt bevestigen dat de tool op zichzelf staat door de verbinding met internet te verbreken - het blijft werken Dit is hetzelfde principe aan de client-kant achter elke tool op Toolz.dev, waarvoor ik het volledige pleidooi in de Gegevensprivacy in online tools article.
FAQ
Hoe schrijf ik een cron-uitdrukking?
Een standaard cron-expressie heeft vijf velden gescheiden door spaties: minuut, uur, dag van de maand, maand en dag van de week Elk veld is een specifieke waarde, een lijst, een bereik, een stap, of * voor elke. Bijvoorbeeld 0 8 * * 1-5 betekent van maandag tot en met vrijdag om 08:00 uur Deze tool bouwt de uitdrukking voor u op en laat zien wat het betekent terwijl u gaat.
Wat betekenen de vijf cronvelden?
Van links naar rechts zijn ze minuut (0-59), uur (0-23), dag van maand (1-31), maand (1-12), en dag van week (0-6, waarbij 0 en 7 beide zondag betekenen) Een ster in een veld betekent & quot; elk" waarde van dat veld Het gereedschap labelt elk veld zodat u de volgorde niet hoeft te onthouden.
Wat doet? */5 bedoel in cron?
De schuine streep introduceert een stapwaarde In het veld minuut, */5 betekent "elke 5 minuten" - 0, 5, 10, 15, enzovoort. Je kunt stappen ook combineren met bereiken 0-30/10 in het minutenveld betekent minuten 0, 10, 20 en 30. Stappen zijn de standaardmanier om " elke N eenheden."
Waarom loopt mijn baan vaker dan verwacht met de dag van de maand en de dag van de week?
Dit is de meest voorkomende cron verrassing Wanneer zowel de dag-van-maand en dag-van-week velden zijn beperkt (geen van beide is *), standaard cron behandelt ze als OR, niet EN - de taak loopt wanneer een van beide voorwaarden overeenkomt Dus 0 0 13 * 5 loopt op de 13e van de maand en elke vrijdag, niet alleen op vrijdag de 13e Laat één veld achter als * tenzij je het OK-gedrag echt wilt.
In welke tijdzone worden de volgende looptijden weergegeven?
De preview berekent aankomende runs in UTC, zodat het resultaat voor iedereen hetzelfde is. Echte cron-daemons gebruiken de servertijdzone (of een TZ-instelling), dus als uw server in een andere zone draait, compenseer dan de tijden dienovereenkomstig. De expressie zelf heeft geen tijdzone - het is de planner die beslist.
Kan ik namen als mon of jan gebruiken in plaats van nummers?
Ja. Het maandveld accepteert JAN doorgaand DEC en het veld van de dag van de week accepteert SUN doorgaand SAT, hoofdletterongevoelig De tool begrijpt ze bij het valideren en beschrijven van uw expressie Numerieke waarden zijn draagbaarder over planners, dus de generator zendt getallen uit, maar benoemde invoer wordt volledig ondersteund.
Is dit hetzelfde als crontab-syntaxis?
Ja, dit genereert standaard Unix/Vixie-cron met vijf velden die wordt gebruikt door crontab, de meeste CI-systemen en Kubernetes CronJobs. Sommige planners voegen een veld van zesde seconden toe of niet-standaard extensies zoals @reboot; die maken geen deel uit van de vijfveldenstandaard Voor het overgrote deel van de planningsbehoeften is de vijfveldenexpressie die deze tool produceert precies wat je wilt.
Wordt mijn schema ergens naartoe gestuurd?
Nee De expressie wordt volledig in uw browser gebouwd, gevalideerd, beschreven, en gesimuleerd met code aan de clientzijde Niets wordt geüpload of opgeslagen U kunt dit bevestigen door de verbinding met internet te verbreken - de generator werkt nog steeds.



