aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Tools & DevOps

Linux cron job: geplande taken met crontab

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 cron of crond genoemd).
  • 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/php in plaats van php, volledige paden in plaats van ./script.sh.
  • Doe waar nodig een cd naar 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 je sudo 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.

Bu kategorideki tüm yazılar →

Devamı için