Een Linux cron job is een geplande taak die op de achtergrond een commando of script uitvoert volgens een schema dat jij bepaalt. Wanneer je wilt dat herhalend werk — back-ups, logbestanden opschonen, een API pollen of de scheduler van Laravel aanroepen — door het systeem wordt getriggerd in plaats van met de hand, is cron precies het juiste gereedschap. In deze gids loop ik door de crontab-syntaxis, praktijkvoorbeelden, logging en de valkuilen waar mensen het vaakst over struikelen.
cron, crontab en de cron-daemon
Drie begrippen uit elkaar houden maakt alles helderder:
- cron: de altijd draaiende achtergronddienst die de klok bewaakt en taken triggert (de daemon, op de meeste distributies
cronofcrondgenoemd). - crontab: de "cron table", het configuratiebestand waarin taken staan. Elke gebruiker heeft een eigen crontab.
- cron job: één regel in die tabel — een schema plus een uit te voeren commando.
Om je eigen crontab te bewerken:
crontab -e # bewerken
crontab -l # huidige taken tonen
crontab -r # alle taken verwijderen (let op!)
Crontab-syntaxis: de vijf velden
Elke regel bestaat uit vijf tijdvelden gevolgd door het commando:
# ┌───────── minuut (0-59)
# │ ┌─────── uur (0-23)
# │ │ ┌───── dag v/d maand (1-31)
# │ │ │ ┌─── maand (1-12)
# │ │ │ │ ┌─ dag v/d week (0-7, 0 en 7 = zondag)
# │ │ │ │ │
# * * * * * uit-te-voeren-commando
In elk veld werken speciale tekens:
*— elke waarde ("elke minuut", "elk uur").,— een lijst:0,15,30,45.-— een bereik:1-5(maandag–vrijdag)./— een stap:*/10(elke 10 eenheden).
Bruikbare cron-voorbeelden
De syntaxis kan abstract ogen; concrete voorbeelden maken het duidelijk:
# Back-upscript elke dag om 02:30
30 2 * * * /home/aslain/scripts/backup.sh
# Gezondheidscontrole elke 5 minuten
*/5 * * * * /usr/bin/curl -fsS https://aslain.dev/health
# Rapport om 09:00 op werkdagen
0 9 * * 1-5 /home/aslain/scripts/report.sh
# Logrotatie om middernacht op de 1e van elke maand
0 0 1 * * /home/aslain/scripts/rotate-logs.sh
# Laravel-scheduler elke 15 minuten
*/15 * * * * cd /var/www/site && php artisan schedule:run
Je hoeft de syntaxis niet uit je hoofd te leren: tools als crontab.guru vertalen een expressie naar gewone taal. Toch bespaart het begrijpen van de logica je tijd bij het debuggen.
Omgevingsvariabelen en absolute paden
Het verraderlijkste aan cron is dat taken draaien in een zeer kale omgeving. De PATH, aliassen en profielinstellingen uit je terminal bestaan niet in cron. Daarom is "het werkte in mijn shell maar niet in cron" zo'n veelgehoorde klacht.
- Schrijf commando's en bestanden met absolute paden:
/usr/bin/phpin plaats vanphp, volledige paden in plaats van./script.sh. - Doe waar nodig een
cdnaar de juiste map, of zet de paden hard in het script. - Declareer de benodigde variabelen bovenaan de crontab:
PATH=/usr/local/bin:/usr/bin:/bin
SHELL=/bin/bash
MAILTO=hello@aslain.dev
30 2 * * * /home/aslain/scripts/backup.sh
Om het juiste pad te vinden, voer je in je terminal which php of command -v node uit en gebruik je het volledige pad dat verschijnt.
Output loggen en fouten opvangen
Standaard probeert cron de output van een taak te mailen naar de gebruiker. Als mail niet is ingesteld, verdwijnt de output en zie je niet wat er misging. De oplossing: stuur de output naar een bestand.
# schrijf stdout en stderr naar een logbestand
30 2 * * * /home/aslain/scripts/backup.sh >> /var/log/backup.log 2>&1
Hier stuurt 2>&1 de foutstroom (stderr) naar hetzelfde bestand als de standaarduitvoer (stdout), en voegt >> toe in plaats van te overschrijven. Voor een stille taak waarvan de output je niets kan schelen, gebruik je > /dev/null 2>&1 — maar pas nadat je klaar bent met debuggen.
Je kunt ook in de systeemlogs nagaan of taken echt zijn getriggerd:
grep CRON /var/log/syslog # Debian/Ubuntu
journalctl -u cron --since today # systemd-gebaseerde systemen
Veelgemaakte fouten
- Het procentteken. In crontab heeft
%een speciale betekenis (nieuwe regel) en splitst het het commando. Escape elke%in datumformaten als\%. - Overlappende runs. Een taak die langer duurt dan zijn interval kan over de volgende heen lopen. Vergrendel hem met
flock:flock -n /tmp/job.lock /home/aslain/scripts/job.sh. - Uitvoerrecht. Zorg dat het script uitvoerbaar is:
chmod +x script.sh, met een shebang (#!/bin/bash) op de eerste regel. - Verkeerde gebruiker. Plaats de taak in de crontab van de gebruiker met de juiste rechten; voor
root-taken gebruik jesudo crontab -e.
Veelgestelde vragen
Wanneer gebruik ik een systemd-timer in plaats van cron?
Op moderne systemd-distributies zijn timers sterker voor afhankelijkheden, uitgesteld starten, het inhalen van gemiste runs (Persistent=true) en gedetailleerde logging. Voor eenvoudige periodieke taken is cron meer dan genoeg en overal beschikbaar; voor complexe, service-achtige schema's kun je een systemd-timer overwegen.
Kan ik iets elke seconde uitvoeren?
Nee — de kleinste eenheid van cron is één minuut. Voor vaker uitvoeren gebruik je een lus met sleep in een script, of stap je over op een systemd-timer met OnUnitActiveSec.
Wat gebeurt er met taken die gemist worden terwijl de server uit staat?
Klassieke cron haalt gemiste runs niet in; het tijdslot wordt overgeslagen terwijl de machine offline is. Om uitgestelde taken bij het opstarten te draaien, gebruik je anacron of de optie Persistent van een systemd-timer.
Lopen je geplande taken in de soep? Wil je de back-ups, deployments en onderhoudsscripts op je server koppelen aan betrouwbare cron jobs, neem dan contact op — dan zetten we samen een opgeruimde, gelogde setup op.