Cron-uttrykk forklart: Planlegg hva som helst
Du trenger å kjøre en databasesikkerhetskopi hver natt klokken 03:00. Eller sende en rapport hver mandag morgen. Eller tømme en cache hvert 15. minutt. På Linux- og Unix-servere er verktøyet for dette cron, og måten du forteller cron når noe skal kjøres på, er med et cron-uttrykk.
Cron-uttrykk ser skremmende ut ved første øyekast. 0 3 * * * eller */15 9-17 * * 1-5 kan virke som volapyk hvis du ikke kjenner mønsteret. Men syntaksen er overraskende enkel når du forstår de fem feltene.
De fem feltene
Hvert standard cron-uttrykk har nøyaktig fem felt, adskilt med mellomrom. Hvert felt representerer en tidsenhet:
┌───────────── minutt (0-59)
│ ┌───────────── time (0-23)
│ │ ┌───────────── dag i måneden (1-31)
│ │ │ ┌───────────── måned (1-12)
│ │ │ │ ┌───────────── ukedag (0-7, der 0 og 7 er søndag)
│ │ │ │ │
* * * * *
Det er alt. Fem felt, fra venstre til høyre: minutt, time, dag i måneden, måned, ukedag.
Visste du? Navnet «cron» kommer fra det greske ordet «chronos», som betyr tid. Cron-demonen (bakgrunnsprosessen) har vært en kjernedel av Unix-lignende operativsystemer siden 1975.
Spesialtegnene
Asterisk (*) — Alle verdier
En asterisk betyr «alle mulige verdier» for det feltet.
* * * * * = hvert minutt av hver time av hver dag.
Komma (,) — Flere verdier
Et komma skiller individuelle verdier.
0 9,12,18 * * * = på minutt 0 av timene 9, 12 og 18 (kl. 09:00, 12:00 og 18:00).
Bindestrek (-) — Verdiintervall
En bindestrek definerer et intervall.
0 9-17 * * * = på minutt 0 av hver time fra 9 til 17 (kl. 09:00 til 17:00, hver time).
Skråstrek (/) — Stegverdier
En skråstrek definerer intervaller.
*/15 * * * * = hvert 15. minutt (minutt 0, 15, 30 og 45 av hver time).
0 */2 * * * = hver 2. time på minutt 0 (midnatt, kl. 02:00, kl. 04:00 ...).
Lese cron-uttrykk: Øvelse
La oss gå gjennom vanlige eksempler. For hvert tilfelle, les de fem feltene fra venstre til høyre.
0 3 * * * — Daglig kl. 03:00
| Felt | Verdi | Betydning |
|---|---|---|
| Minutt | 0 | På minutt 0 |
| Time | 3 | Av time 3 (kl. 03:00) |
| Dag i måneden | * | Hver dag |
| Måned | * | Hver måned |
| Ukedag | * | Hver ukedag |
Oversettelse: «Kl. 03:00 hver dag.» Det klassiske valget for nattlige sikkerhetskopier.
*/15 * * * * — Hvert 15. minutt
| Felt | Verdi | Betydning |
|---|---|---|
| Minutt | */15 | Hvert 15. minutt |
| Time | * | Hver time |
| Dag i måneden | * | Hver dag |
| Måned | * | Hver måned |
| Ukedag | * | Hver dag |
Oversettelse: «Hvert 15. minutt, døgnet rundt.» Vanlig for helsesjekker og cache-oppdateringer.
0 9 * * 1-5 — Hverdager kl. 09:00
| Felt | Verdi | Betydning |
|---|---|---|
| Minutt | 0 | På minutt 0 |
| Time | 9 | Av time 9 |
| Dag i måneden | * | Hver dag |
| Måned | * | Hver måned |
| Ukedag | 1-5 | Mandag til fredag |
Oversettelse: «Kl. 09:00, mandag til fredag.» Perfekt for daglige arbeidsrapporter.
0 0 1 * * — Den første dagen i hver måned
| Felt | Verdi | Betydning |
|---|---|---|
| Minutt | 0 | På minutt 0 |
| Time | 0 | Av time 0 (midnatt) |
| Dag i måneden | 1 | Den 1. |
| Måned | * | Hver måned |
| Ukedag | * | Hvilken som helst ukedag |
Oversettelse: «Ved midnatt den første dagen i hver måned.» Brukes til månedlige rapporter, fakturering eller opprydding.
30 8 * * 1 — Mandager kl. 08:30
| Felt | Verdi | Betydning |
|---|---|---|
| Minutt | 30 | På minutt 30 |
| Time | 8 | Av time 8 |
| Dag i måneden | * | Hver dag |
| Måned | * | Hver måned |
| Ukedag | 1 | Mandag |
Oversettelse: «Kl. 08:30 hver mandag.» Flott for ukentlige teamvarsler.
Skrive dine egne cron-uttrykk
Her er en systematisk fremgangsmåte:
- Start med når. «Hver dag kl. 03:00» eller «hvert 5. minutt i arbeidstiden.»
- Fyll inn feltene fra venstre til høyre. Start med minutt, deretter time, deretter dag i måneden, deretter måned, deretter ukedag.
- Bruk
*for «hver». Hvis du ikke bryr deg om et felt, bruk*. - Test før distribusjon. Bekreft alltid at uttrykket gir tidsplanen du forventer.
Hurtigreferanse for vanlige mønstre
| Tidsplan | Uttrykk |
|---|---|
| Hvert minutt | * * * * * |
| Hvert 5. minutt | */5 * * * * |
| Hver time | 0 * * * * |
| Hver dag ved midnatt | 0 0 * * * |
| Hver dag kl. 03:00 | 0 3 * * * |
| Hver mandag kl. 09:00 | 0 9 * * 1 |
| Hverdager kl. 08:30 | 30 8 * * 1-5 |
| Den 1. i hver måned | 0 0 1 * * |
| Hvert 15. min, arbeidstid | */15 9-17 * * 1-5 |
| To ganger daglig (9 og 18) | 0 9,18 * * * |
| Hver søndag kl. 02:00 | 0 2 * * 0 |
Vanlige feil
Å glemme at timer er 0–23
Time 13 er kl. 13:00, ikke time 1. En vanlig feil er å skrive 0 1 * * * i den tro at det kjører kl. 13:00, mens det faktisk kjører kl. 01:00.
Forvirring om ukedag
Søndag kan være 0 eller 7 (begge er gyldige). Mandag er 1, lørdag er 6. Noen forventer at mandag er 0.
Samspillet mellom dag i måneden og ukedag
Hvis du spesifiserer både dag i måneden og ukedag (ingen av dem er *), vil de fleste cron-implementasjoner kjøre jobben når enten betingelse er oppfylt, ikke når begge er oppfylt. Dette overrasker mange.
Advarsel Uttrykket 0 9 15 * 1 betyr IKKE «kl. 09:00 den 15., men bare hvis det er en mandag». Det betyr «kl. 09:00 den 15. i hver måned OG kl. 09:00 hver mandag». Dette er en vanlig kilde til uventet atferd.
Tidssonebevissthet
Cron kjører i serverens lokale tidssone. Hvis serveren er i UTC og du er i Norge (UTC+1 eller UTC+2), vil en 0 9 * * * cron-jobb kjøre til en annen tid enn du forventer. Sjekk alltid serverens tidssone.
Tips Test og visualiser cron-uttrykkene dine før du distribuerer dem: Slik leser og tester du cron-uttrykk. Se neste kjøretidspunkt og bekreft at tidsplanen stemmer med det du ønsker.
Bygg og test cron-uttrykkene dine:
Gratis, øyeblikkelig og uten registrering.