Cron-uttryck förklarade: Schemalägg vad som helst
Du behöver köra en databassäkerhetskopiering varje natt kl. 03:00. Eller skicka en rapport varje måndag morgon. Eller rensa en cache var 15:e minut. På Linux- och Unix-servrar är verktyget för detta cron, och sättet du talar om för cron när något ska köras är med ett cron-uttryck.
Cron-uttryck ser skrämmande ut vid första anblicken. 0 3 * * * eller */15 9-17 * * 1-5 kan verka som nonsens om du inte känner till mönstret. Men syntaxen är förvånansvärt enkel när du förstår de fem fälten.
De fem fälten
Varje standard-cron-uttryck har exakt fem fält, separerade med mellanslag. Varje fält representerar en tidsenhet:
┌───────────── minut (0-59)
│ ┌───────────── timme (0-23)
│ │ ┌───────────── dag i månaden (1-31)
│ │ │ ┌───────────── månad (1-12)
│ │ │ │ ┌───────────── veckodag (0-7, där 0 och 7 är söndag)
│ │ │ │ │
* * * * *
Det är allt. Fem fält, från vänster till höger: minut, timme, dag i månaden, månad, veckodag.
Visste du att? Namnet "cron" kommer från det grekiska ordet "chronos", som betyder tid. Cron-daemonen (bakgrundsprocessen) har varit en central del av Unix-liknande operativsystem sedan 1975.
Specialtecknen
Asterisk (*) — Varje värde
En asterisk betyder "varje möjligt värde" för det fältet.
* * * * * = varje minut av varje timme av varje dag.
Kommatecken (,) — Flera värden
Ett kommatecken separerar enskilda värden.
0 9,12,18 * * * = vid minut 0 av timmarna 9, 12 och 18 (09:00, 12:00, 18:00).
Bindestreck (-) — Värdeintervall
Ett bindestreck definierar ett intervall.
0 9-17 * * * = vid minut 0 av varje timme från 9 till 17 (09:00 till 17:00, varje timme).
Snedstreck (/) — Stegsvärden
Ett snedstreck definierar intervaller.
*/15 * * * * = var 15:e minut (minut 0, 15, 30, 45 av varje timme).
0 */2 * * * = var 2:a timme vid minut 0 (midnatt, 02:00, 04:00, ...).
Att läsa cron-uttryck: Övning
Låt oss gå igenom vanliga exempel. Läs de fem fälten från vänster till höger för varje exempel.
0 3 * * * — Dagligen kl. 03:00
| Fält | Värde | Betydelse |
|---|---|---|
| Minut | 0 | Vid minut 0 |
| Timme | 3 | Av timme 3 (03:00) |
| Dag i månaden | * | Varje dag |
| Månad | * | Varje månad |
| Veckodag | * | Varje dag i veckan |
Tolkning: "Kl. 03:00 varje dag." Det klassiska valet för nattliga säkerhetskopieringar.
*/15 * * * * — Var 15:e minut
| Fält | Värde | Betydelse |
|---|---|---|
| Minut | */15 | Var 15:e minut |
| Timme | * | Varje timme |
| Dag i månaden | * | Varje dag |
| Månad | * | Varje månad |
| Veckodag | * | Varje dag |
Tolkning: "Var 15:e minut, dygnet runt." Vanligt för hälsokontroller och cache-uppdateringar.
0 9 * * 1-5 — Vardagar kl. 09:00
| Fält | Värde | Betydelse |
|---|---|---|
| Minut | 0 | Vid minut 0 |
| Timme | 9 | Av timme 9 |
| Dag i månaden | * | Varje dag |
| Månad | * | Varje månad |
| Veckodag | 1-5 | Måndag till fredag |
Tolkning: "Kl. 09:00, måndag till fredag." Perfekt för dagliga arbetsrapporter.
0 0 1 * * — Den första dagen varje månad
| Fält | Värde | Betydelse |
|---|---|---|
| Minut | 0 | Vid minut 0 |
| Timme | 0 | Av timme 0 (midnatt) |
| Dag i månaden | 1 | Den 1:a |
| Månad | * | Varje månad |
| Veckodag | * | Vilken dag som helst |
Tolkning: "Vid midnatt den första dagen varje månad." Används för månadsrapporter, fakturering eller rensning.
30 8 * * 1 — Måndagar kl. 08:30
| Fält | Värde | Betydelse |
|---|---|---|
| Minut | 30 | Vid minut 30 |
| Timme | 8 | Av timme 8 |
| Dag i månaden | * | Varje dag |
| Månad | * | Varje månad |
| Veckodag | 1 | Måndag |
Tolkning: "Kl. 08:30 varje måndag." Utmärkt för veckonotiser till teamet.
Skriva egna cron-uttryck
Här är ett systematiskt tillvägagångssätt:
- Börja med när. "Varje dag kl. 03:00" eller "var 5:e minut under kontorstid."
- Fyll i fälten från vänster till höger. Börja med minut, sedan timme, dag i månaden, månad och veckodag.
- Använd
*för "varje". Om du inte bryr dig om ett fält, använd*. - Testa innan du driftsätter. Verifiera alltid att uttrycket ger det schema du förväntar dig.
Snabbreferens för vanliga mönster
| Schema | Uttryck |
|---|---|
| Varje minut | * * * * * |
| Var 5:e minut | */5 * * * * |
| Varje timme | 0 * * * * |
| Varje dag vid midnatt | 0 0 * * * |
| Varje dag kl. 03:00 | 0 3 * * * |
| Varje måndag kl. 09:00 | 0 9 * * 1 |
| Vardagar kl. 08:30 | 30 8 * * 1-5 |
| Den 1:a varje månad | 0 0 1 * * |
| Var 15:e min, kontorstid | */15 9-17 * * 1-5 |
| Två gånger om dagen (09:00 och 18:00) | 0 9,18 * * * |
| Varje söndag kl. 02:00 | 0 2 * * 0 |
Vanliga misstag
Glömma att timmarna är 0–23
Timme 13 är 13:00, inte timme 1. Ett vanligt fel är att skriva 0 1 * * * och tro att det körs kl. 13:00, men det körs faktiskt kl. 01:00.
Förvirring kring veckodag
Söndag kan vara 0 eller 7 (båda är giltiga). Måndag är 1, lördag är 6. En del förväntar sig att måndag ska vara 0.
Samspelet mellan dag i månaden och veckodag
Om du anger både dag i månaden och veckodag (och ingen av dem är *) kör de flesta cron-implementationer jobbet när något av villkoren är uppfyllt, inte när båda är det. Det överraskar många.
Observera Uttrycket 0 9 15 * 1 betyder INTE "kl. 09:00 den 15:e, men bara om det är måndag." Det betyder "kl. 09:00 den 15:e varje månad OCH kl. 09:00 varje måndag." Det är en vanlig källa till oväntat beteende.
Tidszonsmedvetenhet
Cron körs i serverns lokala tidszon. Om din server kör UTC och du befinner dig i Sverige (UTC+1 eller UTC+2 beroende på årstid), körs ett 0 9 * * *-jobb vid 10:00 eller 11:00 din tid. Kontrollera alltid serverns tidszon.
Tips Testa och visualisera dina cron-uttryck innan du driftsätter dem: Så läser och testar du cron-uttryck. Se de kommande körtiderna och bekräfta att schemat stämmer med vad du avser.
Bygg och testa dina cron-uttryck:
Gratis, direkt och ingen registrering krävs.