Hoe maak ik een cronjob aan?
Table of Contents
Een cronjob, ook wel een geplande taak genoemd, wordt erg veel gebruikt in de webhosting wereld. Stel, je wil bijvoorbeeld dat een bepaald script, elke nacht stipt om 2 uur uitgevoerd word, dan kun je daar een cronjob voor aanmaken die exact op het door jou gewenste tijdstip start.
Waar maak ik de cronjob aan?
De locatie waar je een cronjob aanmaakt is per server verschillend. Onderstaande links vertellen je waar je op jouw server een cronjob aan kunt maken:
Voor DirectAdmin: Een cronjob instellen in DirectAdmin
Voor Plesk: Een cronjob instellen op Plesk
Op een server zonder panel (hiervoor is SSH-toegang en kennis van shell commando's nodig)
Hoe werkt de cronjob syntax?
Dit zijn de belangrijkste onderdelen van de cronjob syntax:
De tijdsconfiguratie
Een cronjob begint altijd met vijf velden die de timing specificeren:
Voorbeeld:
* * * * * /pad/naar/commando
Hier zie je dat voor ieder veld een ster is ingevuld. Dat betekent dat deze cronjob elke minuut van elk uur van elke dag van elke maand zal starten.
Elke van die 5 sterren staat voor een tijdseenheid. Van links naar rechts zijn dat:
- Minuten (0-59)
- Uren (0-23)
- Dagen van de maand (1-31)
- Maanden (1-12)
- Dagen van de week (0-7, waarbij 0 en 7 zondag betekenen)
- * is een wildcard symbool en betekent dat het voor alle tijdseenheden van die soort geldt
- Meerdere tijdstippen duidt je aan door middel van komma’s. Bijvoorbeeld:
1,2,3
- Een tijdsperiode geef je aan met een koppelteken. Bijvoorbeeld:
5-7
- Tijdsintervallen geef je aan door middel van een sterretje en een voorwaartse schuine streep. Bijvoorbeeld:
*/2
(elke 2e ...)
Door gebruik te maken van combinaties kun je een zeer precies schema plannen.
Als voorbeeld: 1,5,11-15,30-59/2 * * * *
→ dit betekent dat de cron moet worden uitgevoerd op de minuten 1, 5, 11 t/m 15 en elke 2e minuut tussen 30 en 59.
Een paar eenvoudige voorbeelden:
-
0 3 * * *
→ Elke dag om 03:00 uur. -
*/15 * * * *
→ Elke 15 minuten. -
30 2 * * 1
→ Elke maandag om 02:30 uur.
Het commando-veld
Na de tijdsconfiguratie velden volgt het commando-veld. Dit bepaalt welke taak of script wordt uitgevoerd op de ingestelde tijd.
Wat vindt je in dit veld? Het bevat meestal:
- een interpretor (ook wel: executable)
- een commando / de locatie van het uit te voeren script
- eventueel een output redirect
Laten we het volgende voorbeeld nemen:
/usr/bin/php -f /pad/naar/script.php >/dev/null 2>&1
In dit commando-veld is “/usr/bin/php” → het pad naar de php executable, “/pad/naar/script.php” → de locatie van het php bestand, en “>/dev/null 2>&1” → is de output redirect. De -f flag laat expliciet zien dat het om een bestand gaan.
Nog even als voorbeeld: Als het geen php script maar een bash of een python script was geweest dan zou het interpreter gedeelte er bijvoorbeeld zo uitgezien hebben:
/bin/bash
of /usr/bin/python3
Verderop in dit artikel zullen we nog wat uitgebreider ingaan op de output redirect.
Belangrijk bij het invullen van het command field
- De -f flag
De -f flag die je hierboven ook al in voorbeelden zag staan laat expliciet weten dat het om een file gaat. In sommige gevallen niet noodzakelijk, maar het is goed om je aan te wennen om de -f wel te gebruiken als het om een file gaat.
- Wees zo specifiek mogelijk
Gebruik altijd absolute paden voor zowel de interpretor, als de uitvoerbare bestanden of scripts. Daarmee voorkom je veel problemen met omgevings variabelen die anders kunnen ontstaan. Weet je niet waar de php executable precies staat? Gebruik dan bijvoorbeeld het shell commando: which php
om erachter te komen welk pad je moet gebruiken.
De output van een cronjob
Cronjobs genereren vaak output die standaard wordt verzonden naar de eigenaar van de cronjob via e-mail. Dit kan handig zijn voor bijvoorbeeld foutopsporing, maar soms wil je de output niet in je mail hebben of onderdrukken. We hebben het hier dan over twee verschillende outputs: de standaardoutput (stdout) en de error-output (stderr).
Hier zijn 4 veel gebruikte opties:
Alle output volledig onderdrukken: | * * * * * jouw-commando > /dev/null 2>&1 |
Alle output naar een bestand schrijven: | * * * * * jouw-commando > /pad/naar/output.log 2>&1 |
Alleen foutmeldingen weergeven: | * * * * * jouw-commando > /dev/null |
Aparte logfiles voor stdout en stderr: |
* * * * * jouw-commando > /pad/naar/stdout.log 2> /pad/naar/stderr.log |
Flock op onze Cronjobs
Wij implementeren meestal Flock op de cronjobs op onze servers. Flock zorgt ervoor dat een cron niet dubbel komt te draaien, waardoor de server minder load krijgt en dus sneller zal zijn.
Stel je hebt een cron draaien die er gemiddeld 3 minuten over doet om af te ronden, maar in de cronjob zelf staat dat deze elke minuut draait. Dan zal de cron na een bepaalde tijd, meerdere keren tegelijkertijd draaien. Zulke gestapelde processen zorgen voor allerlei problemen.
Flock voorkomt dit door een “lock” bestand aan te maken. Zodra de cron draait word het lock bestand vergrendeld op een hoger (kernel) niveau hierdoor weet hij dat de cron nog draait en zal de cron niet opnieuw starten. Zo'n lock bestand ziet er dan bijvoorbeeld uit als:
~/cron.lock.zdeyyiaq
Dit bestand staat in de home directory van de gebruiker van wie de cronjob is.
Mocht flock ervoor zorgen dat je cron niet meer goed draait, dan kan
je achter je cron het volgende zetten # noflock (let goed op de spatie
tussen # en noflock)