Cron-expressieparser

Vijf velden gescheiden door spaties, of een verkorte notatie zoals @daily.

Je erft een crontab vol regels als 0 */2 * * 1-5 en 30 3 * JAN,JUL 1. Deze parser schrijft elk veld uit tot precies de waarden die het selecteert, dus in plaats van te gokken wat */2 dekt, zie je de twaalf uren die eruit komen en het aantal ernaast. Je krijgt er de genormaliseerde vorm met 5 velden bij, een waarschuwing zodra de expressie een bekende valkuil is, en de volgende 5 uitvoeringstijden, berekend in je eigen tijdzone.

Zo ontleed je een cron-expressie

  1. 1

    Plak de expressie

    Een regel met 5 velden (`* * * * *`): minuut, uur, dag van de maand, maand en dag van de week. Verkorte notaties als `@daily` werken ook.

  2. 2

    Lees de uitgeschreven velden

    Elk veld staat er met de waarden die het selecteert en hoeveel dat er zijn, dus `*/2` in het uurveld toont 0, 2, 4 en de negen andere die eronder vallen.

  3. 3

    Controleer de volgende uitvoeringen

    5 komende uitvoeringstijden, in je browser berekend vanuit je eigen tijdzone. Kloppen ze niet met je bedoeling, dan scherp je de expressie aan.

  4. 4

    Lees de waarschuwingen

    De parser markeert de valkuilen: allebei de dagvelden ingevuld, een datum die nooit voorkomt, of een operator die standaard cron niet kent.

Wat elk veld allemaal selecteert

Een veld is niet één waarde, het is een verzameling. Weten hoe groot die verzameling is, beantwoordt meestal meteen de vraag waarmee je kwam.

Veld Bereik * selecteert Opmerkingen
Minuut 0-59 60 waarden De meest voorkomende oorzaak van taken die op hol slaan
Uur 0-23 24 waarden 24-uursklok, nooit 1-12
Dag van de maand 1-31 31 waarden Korte maanden slaan de ontbrekende dagen gewoon over
Maand 1-12 12 waarden JAN tot en met DEC mag ook
Dag van de week 0-7 7 waarden 0 en 7 zijn allebei zondag

Operatoren binnen een veld: * voor elke waarde, 1,5,10 voor een lijst, 1-5 voor een bereik, */15 voor een stap geteld vanaf het begin van het bereik en 0-45/15 voor een stap binnen een bereik.

Namen en verkorte notaties worden geaccepteerd

Namen van maanden en dagen van de week worden herkend en uitgeschreven tot de nummers waar ze voor staan, dus 30 3 * JAN,JUL 1 meldt maand 1, 7 en dag van de week 1. De verkorte notaties worden nog vóór al het andere uitgeschreven tot hun vorm met 5 velden:

Verkorte notatie Wordt uitgeschreven als Betekenis
@yearly, @annually 0 0 1 1 * Middernacht op 1 januari
@monthly 0 0 1 * * Middernacht op de 1e
@weekly 0 0 * * 0 Middernacht op zondag
@daily, @midnight 0 0 * * * Elke dag om middernacht
@hourly 0 * * * * Aan het begin van elk uur

@reboot wordt ook herkend, maar heeft geen schema om uit te schrijven: die draait eenmalig bij het opstarten van de machine, dus er valt geen uitvoeringstijd te tonen.

Waarschuwingen die je echt moet lezen

  • Allebei de dagvelden ingeperkt. 0 0 1 * MON betekent niet “de 1e, maar alleen als het een maandag is”. Standaard cron behandelt de twee dagvelden als OF zodra ze allebei zijn ingeperkt, dus die regel draait op de 1e van elke maand én op elke maandag. De parser waarschuwt daarvoor, en de uitvoeringstijden volgen diezelfde OF-regel.
  • Een datum die nooit voorkomt. 0 0 30 2 * vraagt om 30 februari. De expressie is syntactisch geldig en cron accepteert hem, maar hij wordt nooit uitgevoerd. De parser zegt dat erbij, in plaats van je een lege lijst zonder uitleg voor te schotelen.
  • Quartz-operatoren. L (laatste), W (dichtstbijzijnde werkdag), # (de zoveelste weekdag van de maand) en ? zijn uitbreidingen van Quartz, geen standaard crontab. In een regel met 5 velden worden ze herkend en gemarkeerd, en het veld laat zien dat het om een Quartz-operator gaat in plaats van om een lijst met waarden. Er worden geen uitvoeringstijden berekend, want standaard cron zou die regel überhaupt niet draaien.

Wat meteen wordt afgewezen

  • Het verkeerde aantal velden. Een Quartz-regel met 6 velden (met seconden) of 7 velden (met jaartal) wordt afgewezen op het aantal velden.
  • Waarden buiten het bereik, bijvoorbeeld minuut 75 of maand 13.
  • Een aflopend bereik zoals 5-1.
  • Een stapgrootte van 0, zoals */0.

Elke afwijzing noemt het veld en de waarde die de fout veroorzaakt, zodat je één ding aanpast in plaats van de hele regel opnieuw te schrijven.

Tijdzone

De volgende uitvoeringstijden worden in je browser berekend, in de tijdzone die op je apparaat staat ingesteld. Een crontab draait in de tijdzone van de machine waarop hij staat, dus als die server op UTC staat en jij niet, verschuif de tijden dan voordat je ze vergelijkt.

Veelgestelde vragen

Niet als schema. Een Quartz-regel met 6 velden (met seconden) of 7 velden (met jaartal) wordt afgewezen op het aantal velden. Quartz-operatoren binnen een gewone regel met 5 velden (L, W, #, ?) zijn een ander geval: die worden herkend en gemarkeerd, maar er worden geen uitvoeringstijden berekend, want standaard cron zou die regel ook niet draaien.

Meestal komt het door een verschil in tijdzone tussen je apparaat en de server die de crontab draait, of doordat allebei de dagvelden zijn ingevuld. Zijn dag van de maand en dag van de week allebei ingeperkt, dan draait cron zodra één van de twee overeenkomt en niet pas als ze allebei kloppen, dus 0 0 1 * MON draait veel vaker dan de meeste mensen denken. Het aantal waarden naast elk veld is de snelste manier om een veld te betrappen dat ruimer is dan je dacht.

Ja. Kubernetes gebruikt de standaardsyntaxis met 5 velden. Het enige waarvoor je moet corrigeren is de klok: een CronJob draait in de tijdzone van het cluster (UTC, tenzij spec.timeZone iets anders zegt), terwijl de tijden hier uit de tijdzone van je eigen apparaat komen.

Het zijn verkorte notaties die Linux-cron accepteert in plaats van vijf velden. @daily (ook @midnight) is 0 0 * * *, @weekly is 0 0 * * 0, @monthly is 0 0 1 * *, @yearly (ook @annually) is 0 0 1 1 * en @hourly is 0 * * * *. Plak er een en de parser laat je de vorm met 5 velden zien waartoe hij uitgeschreven wordt. @reboot is de uitzondering: die draait bij het opstarten, dus heeft geen schema en geen uitvoeringstijden.

Gerelateerde tools

Tool beschikbaar in andere talen