Crontab Guru

Klistra in ett cron-uttryck och få en fält-för-fält-förklaring på enkel engelska av vad det gör. Ingen anledning att komma ihåg fältordningen eller slå upp intervallen: gurun går igenom vart och ett av de fem fälten (minut, timme, dag i månad, månad och veckodag) och läser uttrycket från vänster till höger. Användbart för att kontrollera en crontab-rad innan du driftsätter den, eller för att förklara en rad du ärvt.

Så använder du gurun

  1. 1

    Klistra in uttrycket

    Kopiera valfritt standardmässigt cron-uttryck med 5 fält (till exempel `0 9 * * 1-5`) i inmatningsfältet.

  2. 2

    Be om förklaringen

    Klicka på Explain Cron så returnerar verktyget en rad-för-rad-beskrivning av varje fält: minut, timme, dag i månad, månad och veckodag.

  3. 3

    Läs beskrivningen

    Förklaringen genereras på engelska, till exempel "Minute: every 5 minutes" eller "Hour: from 9 through 17."

  4. 4

    Kontrollera innan du driftsätter

    Använd förklaringen för att bekräfta att schemat gör det du vill innan du lägger in det i din crontab, CI-konfiguration eller Kubernetes-manifest.

Fält-fusklapp

 ┌───────────── minut (0-59)
 │ ┌─────────── timme (0-23)
 │ │ ┌───────── dag i månad (1-31)
 │ │ │ ┌─────── månad (1-12 eller JAN-DEC)
 │ │ │ │ ┌───── veckodag (0-6 eller SUN-SAT; Sön = 0 eller 7)
 │ │ │ │ │
 * * * * *

Operatorer i cron-uttryck

Operator Betydelse Exempel
* Varje värde * * * * *
, Lista av värden 0,15,30,45
- Intervall 9-17
/ Steg (start/steg) */5, 0-30/5
L Sista (dag-i-månad eller sista veckodagen, Quartz) L, 5L
W Närmaste vardag 15W (Quartz)
# N:te veckodagen i månaden 1#3 (Quartz)
? Inget specifikt värde Endast Quartz

Läsordningen spelar roll

0 */2 * * 1-5 läses från vänster till höger som: minut 0, varannan timme, valfri dag i månad, valfri månad, måndag till fredag. Av vana läser människor ibland fälten från höger till vänster och blir förvirrade; börja alltid från minut.

Fällan “varje X minuter”

*/10 * * * * körs vid minut 0, 10, 20, 30, 40, 50, inte “var 10:e minut från när jobbet än skapades.” Cron-steg mäts alltid från början av fältets intervall. Om du driftsätter ett jobb kl. 12:03 är den första körningen kl. 12:10, inte 12:13.

För jobb som verkligen behöver “N minuter efter den senaste körningen”, använd en schemaläggare med en beständig timer (systemd-timrar med OnUnitActiveSec, eller schemaläggning på applikationsnivå med en lagrad tidsstämpel för senaste körning).

Cron-fällor värda att känna till

  • Både dag-i-månad och veckodag inställda: de flesta cron-implementationer behandlar detta som ELLER-beteende, troligen inte vad du vill.
  • Steg på 0: */0 är ogiltigt.
  • Intervall som vänder runt: 22-2 för timmar fungerar inte i klassisk cron; använd 22-23,0-2.
  • 30 februari: ett schema som 0 0 30 2 * körs aldrig.
  • DST-tvetydighet: jobb schemalagda mellan kl. 02 och 03 kan köras två gånger eller noll gånger på dagar med övergång till/från sommartid.

Cron kontra moderna schemaläggare

Unix-cron finns fortfarande överallt, men för något kritiskt vill du förmodligen ha:

  • systemd-timrar: fångar missade körningar, stödjer randomiserade offset, läser från unit-filer.
  • Kubernetes CronJob: deklarativ, omförsök, tidszonsmedveten i 1.25+.
  • Airflow / Prefect / Dagster: för jobb med beroenden, omförsök, backfills, observerbarhet.
  • GitHub Actions schedule: cron med 5 fält, endast UTC, minst 5-minutersintervall, leverans efter bästa förmåga.

Cron i sig är ett utmärkt format men en dålig schemaläggare för jobb som inte får missas.

Vanliga frågor

Eftersom veckodag 0 är söndag i standard-cron (och 7 är också söndag, vilket stödjer båda konventionerna). Måndag är 1. Quartz numrerar veckodagar 1-7 med söndag = 1, vilket ofta ställer till det för folk som flyttar mellan dialekter.

Klassisk Unix-cron körs i serverns lokala tidszon, vad /etc/timezone än säger. Kubernetes CronJob, GitHub Actions och de flesta molnschemaläggare körs i UTC som standard. Bekräfta alltid och, när det är möjligt, använd UTC för att undvika DST-överraskningar.

Klassisk cron kan inte uttrycka detta direkt. Lösning: kör varje måndag och kontrollera datumet inuti skriptet: [ $(date +%d) -le 7 ] && ./job.sh. Quartz stödjer det nativt med 1#1.

Nej. Varje schema behöver sin egen rad. Men du kan kombinera flera scheman på en rad med listor: 0 9,17 * * * körs kl. 9 och kl. 17. För scheman som inte kan uttryckas som en enda rad, lägg till flera rader som pekar på samma kommando.

Relaterade verktyg

Verktyget finns på andra språk