Tools Blog

Cron-expressies begrijpen: een praktische gids voor taakautomatisering

Cron Job Automation

Als je ooit een Linux-server hebt beheerd, in backend-ontwikkeling hebt gewerkt of geautomatiseerde cloudfuncties hebt opgezet, ben je waarschijnlijk een tekenreeks tegengekomen die er ongeveer zo uitziet: 0 2 * * *. Voor niet-ingewijden lijkt het op een typfout op het toetsenbord. Voor systeembeheerders is dit de hartslag van moderne infrastructuurautomatisering: een Cron-expressie.

Cron is de onzichtbare motor die het internet aandrijft. Het zorgt ervoor dat uw database om 03.00 uur een back-up maakt, activeert de e-mails die u elke maandagochtend ontvangt en wist tijdelijke serverbestanden voordat deze het systeem laten crashen. Maar ondanks zijn kracht is de syntaxis notoir moeilijk voor mensen om te ontleden. In deze diepgaande duik zullen we de sterretjes demystificeren en je leren hoe je cron-schema's leest en schrijft als een doorgewinterde DevOps-ingenieur.

Wat is Cron en de Crontab?

Cron is een op tijd gebaseerde taakplanner die wordt aangetroffen in Unix-achtige computerbesturingssystemen. De naam "cron" komt van het Griekse woord voor tijd, chronos. Gebruikers die softwareomgevingen opzetten en onderhouden, gebruiken cron om taken (opdrachten of shellscripts) zo te plannen dat ze periodiek op vaste tijden, datums of intervallen worden uitgevoerd.

De Crontab (Cron Table) is het configuratiebestand waarin deze schema's worden opgeslagen. Wanneer u uw crontab via de terminal bewerkt, schrijft u een lijst met instructies die de server precies vertellen wat hij moet uitvoeren en wanneer.

Deconstructie van de 5 sterretjes

Een standaard cron-expressie bestaat uit 5 velden, gescheiden door witruimte. Elk veld vertegenwoordigt een specifieke tijdseenheid en wordt altijd van links naar rechts in deze exacte volgorde gelezen:

* * * * *  command_to_execute
- - - - -
| | | | |
| | | | +----- Day of the Week (0 - 6) (Sunday=0 or 7)
| | | +------- Month (1 - 12)
| | +--------- Day of the Month (1 - 31)
| +----------- Hour (0 - 23)
+------------- Minute (0 - 59)

Een asterisk (*) betekent "elke mogelijke waarde voor dit veld". De uitdrukking * * * * * betekent dus letterlijk: "Elke minuut, elk uur, elke dag, elke maand, elke dag van de week uitvoeren."

Syntaxismodificatoren: stappen, bereiken en lijsten

De kracht van cron komt van de modifiers. U bent niet beperkt tot alleen specifieke cijfers of 'alles'.

1. De stapmodificator (/)

Als je wilt dat een script elke 15 minuten wordt uitgevoerd, gebruik je een stap. */15 * * * * betekent "elke minuut die deelbaar is door 15". Deze rijdt om 0, 15, 30 en 45 uur na het hele uur.

2. De bereikmodificator (-)

Als je wilt dat een script alleen tijdens kantooruren draait, gebruik je een range. 0 9-17 * * * betekent "draaien op minuut nul, elk uur van 9.00 tot 17.00 uur".

3. De lijstmodificator (,)

Als je wilt dat iets op specifieke, niet-opeenvolgende dagen wordt uitgevoerd, gebruik dan een lijst. 0 0 1,15 * * betekent "wordt uitgevoerd om middernacht op de 1e en de 15e van de maand".

Stop met het raden van Cron-expressies

Loop niet het risico om elke minuut een back-upscript uit te voeren in plaats van elke maand. Een enkele typefout kan een productieserver laten crashen. Gebruik onze interactieve visuele generator om cron-strings veilig te bouwen en te valideren.

Open de Cron Job Generator

De gevaarlijkste Cron-fout

De meest voorkomende en catastrofale fout die ontwikkelaars maken is het verwarren van het veld 'Minuten'. Laten we eens kijken naar een scenario waarin u één keer per uur om 02:00 uur een script voor het opschonen van de database wilt uitvoeren.

De fout: * 2 * * *

Als u het bovenstaande schrijft, vertelt u de server dat het script "Elke minuut, gedurende het tweede uur van de dag" moet worden uitgevoerd. Uw zware databaseopruimingsscript wordt 60 keer achter elkaar geactiveerd, waardoor uw CPU waarschijnlijk wordt overbelast, databasetabellen worden vergrendeld en een enorme storing wordt veroorzaakt.

De juiste manier: 0 2 * * *

Dit vertelt de server expliciet om alleen op "Minuut nul, van het 2e uur" te draaien. Het wordt precies één keer uitgevoerd om 02:00 uur.

Veelgestelde vragen (FAQ)

Houdt cron rekening met tijdzones?

Standaard evalueert cron expressies op basis van de lokale systeemtijd van de server waarop deze draait. Als uw server wordt gehost in een AWS-regio in Londen, draait deze op UTC/GMT. U moet rekening houden met tijdzoneverschillen als uw gebruikers zich in New York of Tokio bevinden.

Kan ik een cronjob plannen die elke seconde wordt uitgevoerd?

Nee. Standaard Unix-cron is beperkt tot een resolutie van één minuut. Als u een planning in minder dan een minuut nodig heeft (bijvoorbeeld elke 10 seconden), moet u een afzonderlijke daemon-tool gebruiken, of een script schrijven dat elke minuut wordt uitgevoerd, maar intern een lus bevat met slaapopdrachten.

Wat betekenen tekenreeksen als @daily of @hourly?

Veel moderne implementaties van cron ondersteunen niet-standaard vooraf gedefinieerde macro's om het plannen eenvoudiger te maken. @daily is precies hetzelfde als 0 0 * * * (elke dag middernacht). @hourly is hetzelfde als 0 * * * *. Hoewel ze nuttig zijn, worden ze niet universeel ondersteund op alle oudere systemen.