Beräkna de nästa exekveringarna av ett cron-uttryck

analyserar ett cron-uttryck och listar nästa exekveringsdatum

Vad är ett cron-uttryck?

Ett cron-uttryck är en kort sträng som beskriver en återkommande tidpunkt. Det Unix-ärvda formatet ryms i fem fält separerade med mellanslag: minut, timme, dag i månaden, månad och veckodag. Den här syntaxen föddes med cron-demonen av Brian Kernighan på 1970-talet och generaliserades sedan av Vixie cron (1987) som tagits över av alla moderna Linux- och macOS-distributioner. Idag återfinns samma syntax i de flesta moln-schemaläggare (AWS EventBridge, GCP Cloud Scheduler, Azure Logic Apps) och CI/CD (GitHub Actions, GitLab CI, Jenkins).

┌──── minute (0-59)
│ ┌── heure (0-23)
│ │ ┌── jour du mois (1-31)
│ │ │ ┌── mois (1-12 ou JAN-DEC)
│ │ │ │ ┌── jour de la semaine (0-7 ou SUN-SAT, 0 et 7 = dimanche)
│ │ │ │ │
* * * * *

Ett välformat cron-uttryck definierar alltså ett exakt cron-schema: varje fält kan vara ett fast värde, ett intervall, en lista, ett steg eller en asterisk som matchar allt. Kompaktheten i crontab-uttrycket är dess styrka, men det är också det som gör en cron-avkodare oumbärlig för att visuellt validera avsikten. Det är precis vad denna cron-konverterare är till för: producera en läsbar cron-förklaring plus listan över nästa körningar.

Anatomi av ett cron-uttryck

De fem fälten delar en gemensam grammatik. Här är de gränser som varje kolumn i ett standardiserat crontab-uttryck accepterar:

  • Minut: 0-59.
  • Timme: 0-23, 24-timmars format.
  • Dag i månaden: 1-31.
  • Månad: 1-12 eller textförkortningarna JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC.
  • Veckodag: 0-7 där 0 och 7 båda representerar söndag, eller förkortningarna SUN, MON, TUE, WED, THU, FRI, SAT.

Specialtecken delade av de fem fälten:

  • *: any value, matchar alla tillåtna värden i fältet.
  • ,: diskret lista, till exempel 1,15,30 i minutfältet.
  • -: inklusivt intervall, till exempel 9-17 för kontorstid.
  • /: steg, till exempel */15 = var 15:e enhet, eller 0-30/5 = var 5:e minut mellan 0 och 30.

Quartz-tillägg (Java, AWS EventBridge, Spring): grammatiken växer till 6 eller 7 fält med en sekunder-kolumn först (0-59) och ibland en år-kolumn sist (1970-2099). Quartz introducerar också ? (no specific value, för att frikoppla dag-i-månaden och veckodag), L (last: sista dagen i månaden, eller sista fredagen med 5L), W (närmaste arbetsdag) och # (N:te veckodag i månaden, till exempel 2#3 för tredje måndagen). Ett Quartz-uttryck är i allmänhet inte kompatibelt med en UNIX-crontab, och vice versa: det är den största felkällan när man kopierar ett cron-uttryck mellan plattformar.

# UNIX / Vixie cron (5 champs)
0 9 * * 1-5

# Quartz (6 champs avec secondes)
0 0 9 ? * MON-FRI

# Quartz (7 champs avec année)
0 0 9 ? * MON-FRI 2026

Varför avkoda ett cron-uttryck?

Att läsa 0 0 * * * går snabbt. Att läsa */7 2-5 1,15 * 1-5 är betydligt svårare. När ett uttryck lämnar det triviala ökar risken för feltolkning och cron-avkodning blir ett granskningssteg i sig.

  • Produktionsdebug: förstå varför en uppgift triggades kl. 03:17 och inte kl. 03:00, eller identifiera en överlappning mellan två jobb.
  • Kodgranskning: validera att en schemaläggare som pushats i en pull request gör vad författaren påstår, utan att behöva memorera semantiken för varje symbol.
  • Schemaläggargranskning: gå igenom cron-jobben i Linux i /etc/crontab och /etc/cron.d/, Jenkins-triggers, spec.schedule i Kubernetes CronJob, reglerna i AWS EventBridge och jobben i GCP Cloud Scheduler.
  • Legacy-migration: ta över en historisk /etc/crontab utan dokumentation och rekonstruera uppgiftskartan före ett infrastrukturbyte.
  • Onboarding: låta en ny utvecklare läsa en crontab utan att behöva lära sig alla specialtecken över en natt.

Så använder du cron-avkodaren

Stegen för att avkoda ett crontab-uttryck med verktyget:

  1. Klistra in ditt cron-uttryck i inmatningsfältet (5 fält separerade med mellanslag).
  2. Ange antalet nästa körningar att räkna ut.
  3. Klicka på convert för att starta cron-avkodningen: verktyget returnerar en mänsklig mening som förklarar utlösningen, plus den daterade listan över nästa körningar.
  4. Kontrollera visuellt att datumen motsvarar din avsikt (timme, dag, frekvens).
  5. Kopiera utdata via kopieringsknappen för att klistra in den i ett ärende, en PR eller en teknisk dokumentation.

Verktyget nöjer sig inte med en syntaktisk parsing: det ger en cron-förklaring i naturligt språk, vilket gör det både till en cron-avkodare och en schemavalidator.

Klassiska exempel på cron-uttryck

Mönstren nedan täcker de flesta cron-scheman som påträffas i produktion. De är alla giltiga på Linux crontab, Kubernetes CronJob, GitHub Actions och de flesta applikationsschemaläggare.

Uttryck Mänsklig läsning
* * * * * Varje minut
0 * * * * Varje hel timme
0 0 * * * Varje dag vid midnatt
0 0 * * 0 Varje söndag vid midnatt
*/15 * * * * Var 15:e minut
0 9 * * 1-5 09:00 måndag till fredag
0 0 1 * * Den 1:a varje månad vid midnatt
0 0,12 * * * Midnatt och middag varje dag
*/5 9-17 * * 1-5 Var 5:e minut under arbetstid
30 2 1,15 * * Den 1:a och 15:e varje månad klockan 02:30

För att köra en cron-uppgift på en Linux-server redigerar man användarens crontab från skalet:

# éditer la crontab de l'utilisateur courant
$ crontab -e

# lister les tâches existantes
$ crontab -l

# exemple de ligne ajoutée : sauvegarde quotidienne à 3h
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Exempel på utdata från cron-konverteraren för */5 * * * *:

2026-05-05 00:00:00
2026-05-05 00:05:00
2026-05-05 00:10:00
2026-05-05 00:15:00
2026-05-05 00:20:00
...

Vanliga frågor om cron-avkodaren

Vad är skillnaden mellan UNIX-cron och Quartz?

UNIX/Vixie cron använder 5 fält (minut till veckodag), utan precision på sekundnivå, och har inget inbyggt begrepp för "sista dagen i månaden". Quartz (Java, Spring, AWS EventBridge) lägger till en sekunder-kolumn först, ibland en år-kolumn sist, och flera symboler (?, L, W, #) som saknas i Linux-crontab. Ett cron-uttryck i Quartz med 6 fält är därför inte direkt portabelt till /etc/crontab, och tvärtom. Vår cron-avkodare riktar sig mot 5-fältsformatet som täcker majoriteten av schemaläggare.

Hur kör man en cron-uppgift var 5:e minut?

Med steget / i minutfältet:

*/5 * * * * /usr/local/bin/check-health.sh

Detta crontab-uttryck triggar skriptet vid minuterna 0, 5, 10, 15... varje timme, varje dag. För att begränsa till arbetstid måndag till fredag, lägg till villkor på timme- och veckodagsfälten: */5 9-17 * * 1-5.

Vad betyder asterisken (*) i ett cron-uttryck?

Asterisken betyder any value: den matchar alla tillåtna värden i fältet. I 0 0 * * * betyder de tre stjärnorna "vilken dag som helst i månaden, vilken månad som helst, vilken veckodag som helst". Kombinerat med de två första fälten satta till 0 får man "varje dag vid midnatt". Stjärnan kan också kombineras med ett steg: */15 i minutfältet = var 15:e minut.

Har crontab en tidszon?

Som standard, serverns tidszon. På en Linux-crontab är det systemets TZ (ofta UTC på VPS och containrar). GitHub Actions tvingar UTC. Kubernetes CronJob använder kontrollerns tidszon, konfigurerbar via spec.timeZone sedan 1.27. AWS EventBridge utvärderar uttryck i UTC. Applikationsschemaläggare (Symfony Scheduler, Quartz, Airflow) tillåter ofta en dedikerad tidszon per uppgift. Vid tvivel, kontrollera date på målservern och jämför med utdata från cron-konverteraren.

Cron-jobb vs kommandot at: vilket ska man välja?

cron används för att köra en återkommande uppgift enligt ett schema. at används för att köra ett kommando en enda gång vid en given tidpunkt. För en daglig säkerhetskopiering, en loggrotation eller ett återkommande API-anrop, använd cron. För att skjuta upp en engångsoperation ("kör om driftsättningen kl. 22 ikväll"), använd at:

$ echo "/usr/local/bin/deploy.sh" | at 22:00
Hur testar man ett cron-uttryck utan att trigga det?

Det är precis rollen för denna cron-konverterare: den räknar ut de N nästa körningarna från den aktuella tidpunkten, utan att starta något jobb. Du ser omedelbart om ditt crontab-uttryck triggar kl. 03:00 som planerat eller kl. 03:17 av misstag. För att gå längre innan du installerar uppgiften kan du också testa enbart skriptet (bash -x script.sh) och kontrollera syntaxen i en crontab-fil med crontab -T fichier på distributioner som stöder det.

Vad händer om både dag-i-månad och veckodag är satta?

På Vixie cron (Linux) är regeln ett logiskt ELLER: jobbet triggas om antingen det ena eller andra fältet matchar. Det är kontraintuitivt och en källa till buggar. Quartz använder ett OCH, vilket är anledningen till att symbolen ? infördes för att uttryckligen signalera "ingen begränsning". Som tumregel, sätt bara ett av de två fälten.

Exempelförfrågan

curl -X POST https://cdrn.fr/api/v1/tools/cron-converter/execute \
  -H "Content-Type: application/json" \
  -d '{"cron":"...","number_next_date":1}'

Indatasschema

Fält Typ Obligatorisk Standard
cron string
number_next_date integer

Slutpunkter

  • GET https://cdrn.fr/api/v1/tools - listar alla tillgängliga verktyg
  • GET https://cdrn.fr/api/v1/tools/cron-converter - hämtar schemat för detta verktyg
  • POST https://cdrn.fr/api/v1/tools/cron-converter/execute - kör detta verktyg med en JSON-payload