Cron-expressies ontrafeld: Plan alles
Je moet elke nacht om 3 uur een databaseback-up uitvoeren. Of elke maandagochtend een rapport versturen. Of elke 15 minuten een cache legen. Op Linux- en Unix-servers is de tool hiervoor cron, en de manier waarop je cron vertelt wanneer iets moet draaien is met een cron-expressie.
Cron-expressies zien er op het eerste gezicht intimiderend uit. 0 3 * * * of */15 9-17 * * 1-5 kan eruitzien als onzin als je het patroon niet kent. Maar de syntax is verrassend eenvoudig zodra je de vijf velden begrijpt.
De vijf velden
Elke standaard cron-expressie heeft precies vijf velden, gescheiden door spaties. Elk veld vertegenwoordigt een tijdseenheid:
┌───────────── minuut (0-59)
│ ┌───────────── uur (0-23)
│ │ ┌───────────── dag van de maand (1-31)
│ │ │ ┌───────────── maand (1-12)
│ │ │ │ ┌───────────── dag van de week (0-7, waarbij 0 en 7 zondag zijn)
│ │ │ │ │
* * * * *
Dat is alles. Vijf velden, van links naar rechts: minuut, uur, dag van de maand, maand, dag van de week.
Wist je dat? De naam "cron" komt van het Griekse woord "chronos," dat tijd betekent. De cron-daemon (achtergrondproces) is sinds 1975 een kernonderdeel van Unix-achtige besturingssystemen.
De speciale tekens
Sterretje (*) — Elke waarde
Een sterretje betekent "elke mogelijke waarde" voor dat veld.
* * * * * = elke minuut van elk uur van elke dag.
Komma (,) — Meerdere waarden
Een komma scheidt individuele waarden.
0 9,12,18 * * * = op minuut 0 van de uren 9, 12 en 18 (09:00, 12:00, 18:00).
Streepje (-) — Bereik van waarden
Een streepje definieert een bereik.
0 9-17 * * * = op minuut 0 van elk uur van 9 tot en met 17 (09:00 tot 17:00, elk uur).
Schuine streep (/) — Stapwaarden
Een schuine streep definieert intervallen.
*/15 * * * * = elke 15 minuten (minuut 0, 15, 30, 45 van elk uur).
0 */2 * * * = elke 2 uur op minuut 0 (middernacht, 02:00, 04:00, ...).
Cron-expressies lezen: oefening
Laten we veelvoorkomende voorbeelden doorwerken. Lees voor elk voorbeeld de vijf velden van links naar rechts.
0 3 * * * — Dagelijks om 03:00
| Veld | Waarde | Betekenis |
|---|---|---|
| Minuut | 0 | Op minuut 0 |
| Uur | 3 | Van uur 3 (03:00) |
| Dag van de maand | * | Elke dag |
| Maand | * | Elke maand |
| Dag van de week | * | Elke dag van de week |
Vertaling: "Elke dag om 03:00." De klassieke keuze voor nachtelijke back-ups.
*/15 * * * * — Elke 15 minuten
| Veld | Waarde | Betekenis |
|---|---|---|
| Minuut | */15 | Elke 15 minuten |
| Uur | * | Elk uur |
| Dag van de maand | * | Elke dag |
| Maand | * | Elke maand |
| Dag van de week | * | Elke dag |
Vertaling: "Elke 15 minuten, dag en nacht." Gebruikelijk voor gezondheidscontroles en cacheverversingen.
0 9 * * 1-5 — Doordeweeks om 09:00
| Veld | Waarde | Betekenis |
|---|---|---|
| Minuut | 0 | Op minuut 0 |
| Uur | 9 | Van uur 9 |
| Dag van de maand | * | Elke dag |
| Maand | * | Elke maand |
| Dag van de week | 1-5 | Maandag tot en met vrijdag |
Vertaling: "Om 09:00, maandag tot en met vrijdag." Perfect voor dagelijkse werkrapporten.
0 0 1 * * — Eerste dag van elke maand
| Veld | Waarde | Betekenis |
|---|---|---|
| Minuut | 0 | Op minuut 0 |
| Uur | 0 | Van uur 0 (middernacht) |
| Dag van de maand | 1 | Op de 1e |
| Maand | * | Elke maand |
| Dag van de week | * | Elke dag van de week |
Vertaling: "Om middernacht op de eerste dag van elke maand." Gebruikt voor maandelijkse rapporten, facturering of opschoningen.
30 8 * * 1 — Maandagen om 08:30
| Veld | Waarde | Betekenis |
|---|---|---|
| Minuut | 30 | Op minuut 30 |
| Uur | 8 | Van uur 8 |
| Dag van de maand | * | Elke dag |
| Maand | * | Elke maand |
| Dag van de week | 1 | Maandag |
Vertaling: "Elke maandag om 08:30." Ideaal voor wekelijkse teamnotificaties.
Je eigen cron-expressies schrijven
Hier is een systematische aanpak:
- Begin met wanneer. "Elke dag om 03:00" of "elke 5 minuten tijdens kantooruren."
- Vul de velden in van links naar rechts. Begin met minuut, dan uur, dan dag van de maand, dan maand, dan dag van de week.
- Gebruik
*voor "elke." Als je een veld niet specifiek hoeft in te vullen, gebruik dan*. - Test voor het implementeren. Controleer altijd of je expressie het schema oplevert dat je verwacht.
Snelreferentie veelvoorkomende patronen
| Schema | Expressie |
|---|---|
| Elke minuut | * * * * * |
| Elke 5 minuten | */5 * * * * |
| Elk uur | 0 * * * * |
| Elke dag om middernacht | 0 0 * * * |
| Elke dag om 03:00 | 0 3 * * * |
| Elke maandag om 09:00 | 0 9 * * 1 |
| Doordeweeks om 08:30 | 30 8 * * 1-5 |
| Eerste van elke maand | 0 0 1 * * |
| Elke 15 min, kantooruren | */15 9-17 * * 1-5 |
| Twee keer per dag (09:00 en 18:00) | 0 9,18 * * * |
| Elke zondag om 02:00 | 0 2 * * 0 |
Veelgemaakte fouten
Vergeten dat uren 0-23 zijn
Uur 13 is 13:00, niet uur 1. Een veelgemaakte fout is 0 1 * * * schrijven in de veronderstelling dat het om 13:00 draait, terwijl het eigenlijk om 01:00 draait.
Verwarring over dag van de week
Zondag kan 0 of 7 zijn (beide zijn geldig). Maandag is 1, zaterdag is 6. Sommige mensen verwachten dat maandag 0 is.
Interactie tussen dag van de maand en dag van de week
Als je zowel dag van de maand als dag van de week specificeert (geen van beide is *), voeren de meeste cron-implementaties de taak uit wanneer een van beide voorwaarden is voldaan, niet wanneer beide zijn voldaan. Dit verrast veel mensen.
Waarschuwing De expressie 0 9 15 * 1 betekent NIET "om 09:00 op de 15e, maar alleen als het een maandag is." Het betekent "om 09:00 op de 15e van elke maand EN om 09:00 op elke maandag." Dit is een veelvoorkomende bron van onverwacht gedrag.
Tijdzonebewustzijn
Cron draait in de lokale tijdzone van de server. Als je server in UTC staat en je bent in Amsterdam (UTC+1), draait een 0 9 * * * cron-taak om 10:00 jouw tijd. Controleer altijd de tijdzone van je server.
Tip Test en visualiseer je cron-expressies voor het implementeren: Cron-expressies lezen en testen. Bekijk de volgende uitvoermomenten en bevestig dat het schema overeenkomt met wat je bedoelt.
Bouw en test je cron-expressies:
Gratis, direct en zonder registratie.