Wat is cron en hoe plan je er taken mee?

Auteur: Gepubliceerd

Kort samengevat: Cron is een mechanisme in Unix- en Linux-systemen dat automatisch opdrachten of scripts uitvoert volgens een vast tijdschema. Je kunt er back-ups mee maken, rapporten genereren of oude bestanden verwijderen, bijvoorbeeld dagelijks om 2:30. Om een taak goed te laten werken, moet je niet alleen het tijdstip vastleggen, maar ook de opdracht, de toegangsrechten en de manier waarop je fouten controleert.

Hoe werkt cron en waarvoor gebruik je het?

Cron draait op de achtergrond als systeemdienst: het controleert het tijdschema en voert de bijbehorende opdrachten uit. Een opdracht met een gepland uitvoeringstijdstip heet een cron-taak. Een crontab is de tabel waarin de tijdschema’s van taken worden opgeslagen.

Veelvoorkomende toepassingen zijn een nachtelijke database-export, gegevens ophalen uit een extern systeem, overzichten opnieuw berekenen en tijdelijke bestanden opruimen. Cron zorgt dat een bewerking wordt gestart, maar bepaalt niet wat die bewerking doet. Als een back-upscript een fout bevat, lost het tijdschema die niet op. Het bevestigt ook niet dat je de back-up kunt terugzetten.

Een taak wordt uitgevoerd met de rechten van de gebruiker aan wie de vermelding toebehoort. Meestal hoef je de taak niet als systeembeheerder uit te voeren. Het account hoort alleen toegang te hebben tot de bestanden en middelen die voor de bewerking nodig zijn.

Hoe lees je een cron-tijdschema?

In een gebruikelijke crontab van een gebruiker bestaat een vermelding uit vijf tijdvelden en een opdracht. Van links naar rechts staan de velden voor: minuut, uur, dag van de maand, maand en dag van de week.

30 2 * * * /usr/bin/python3 /home/anna/scripts/rapport.py

Deze vermelding voert het script dagelijks om 2:30 uit. Een sterretje staat voor elke toegestane waarde van het veld. De drie sterretjes staan dus voor elke dag van de maand, elke maand en elke dag van de week.

TijdschemaBetekenis
*/15 * * * *Elk kwartier: op minuut 0, 15, 30 en 45
0 8 * * 1-5Van maandag tot en met vrijdag om 8:00
0 3 1 * *Op de eerste dag van elke maand om 3:00

Een schuine streep geeft de stapgrootte binnen een veld aan, een koppelteken een bereik en een komma scheidt waarden, bijvoorbeeld 0,30 in het minutenveld. De notatie */15 betekent niet ‘15 minuten nadat de vorige taak is afgelopen’: het tijdschema volgt de klok.

Let op wanneer je zowel de dag van de maand als de dag van de week beperkt. In veelgebruikte cron-implementaties hoeft dan slechts aan een van die twee voorwaarden te worden voldaan, niet aan allebei. Raadpleeg de documentatie van de versie op je server voordat je zo’n notatie gebruikt.

Systeembestanden zoals /etc/crontab hebben bovendien een gebruikersveld vóór de opdracht. Kopieer vermeldingen daaruit niet ongewijzigd naar je persoonlijke crontab.

Hoe stel je je eerste cron-taak in?

Op een server waarop cron is geïnstalleerd en waar je toegang hebt tot de terminal, kun je de onderstaande procedure volgen. De paden zijn voorbeelden: vervang ze door de werkelijke locaties binnen je account.

  1. Test de opdracht handmatig. Voer /usr/bin/python3 /home/anna/scripts/rapport.py uit als dezelfde gebruiker die de taak zal uitvoeren.

  2. Open het tijdschema met de opdracht crontab -e.

  3. Voeg een vermelding toe die de uitvoer naar een bestand schrijft:

    30 2 * * * /usr/bin/python3 /home/anna/scripts/rapport.py >> /home/anna/logs/rapport.log 2>&1
    
  4. Sla de wijzigingen op en controleer de vermeldingen met de opdracht crontab -l.

  5. Controleer na het geplande tijdstip het resultaat, bijvoorbeeld het aangemaakte rapport, en de inhoud van het logbestand.

De operator >> voegt berichten toe aan het bestand. 2>&1 stuurt ook foutmeldingen naar dat bestand. De map logs moet al bestaan en de gebruiker die de taak uitvoert moet erin kunnen schrijven. Het logbestand kan onbeperkt groeien. Bij blijvend gebruik moet je daarom de grootte beperken of logrotatie instellen: het periodiek archiveren en verwijderen van oude loggegevens.

Bij gedeelde hosting stel je het tijdschema vaak in via het beheerpaneel in plaats van de terminal. Controleer in de documentatie van de aanbieder wat het minimale interval tussen uitvoeringen is, welke interpreters beschikbaar zijn en welke limieten voor de uitvoeringstijd gelden.

Waarom werkt de taak niet als de opdracht handmatig wel werkt?

Cron voert opdrachten uit in een beperktere omgeving dan een interactieve terminal. Dezelfde omgevingsvariabelen, programmapaden en shellinstellingen zijn mogelijk niet beschikbaar. Gebruik daarom volledige paden en ga er niet van uit dat de werkmap gelijk is aan de map waarin het script staat.

Als een programma vanuit een specifieke map moet worden gestart, kan de vermelding er zo uitzien:

0 6 * * * cd /home/anna/applicatie && /usr/bin/python3 rapport.py

Als de taak geen resultaat oplevert, controleer dan achtereenvolgens of de cron-dienst werkt, welk account de taak uitvoert, de toegangsrechten, de paden, de benodigde variabelen en de systeem- en applicatielogs. Alleen het ontbreken van een foutmelding bewijst niet dat de taak is geslaagd. Het script moet een mislukking melden en het mogelijk maken om het resultaat te controleren.

Het uitvoeringstijdstip hangt ook af van de ingestelde tijdzone. Controleer die op de server of in het hostingpaneel, vooral als je wilt dat de taak volgens de Poolse tijd wordt uitgevoerd. Bij de overgang tussen zomer- en wintertijd hangt het van de implementatie af wat er gebeurt met taken die in een overgeslagen of herhaald uur vallen.

Welke beperkingen heeft cron?

Klassieke cron haalt uitvoeringen die tijdens het uitschakelen van de server zijn gemist in principe niet in. Het voorkomt ook niet automatisch dat taken elkaar overlappen: als een script 20 minuten draait en elke 10 minuten start, kunnen er twee exemplaren tegelijk actief zijn. Gebruik bij bewerkingen op gedeelde gegevens een vergrendeling, bijvoorbeeld het mechanisme flock dat op veel Linux-systemen beschikbaar is.

Voor taken waarbij gemiste uitvoeringen moeten worden ingehaald, kun je anacron of passend ingestelde systemd-timers overwegen. Als je bewerkingen in een wachtrij wilt plaatsen en mislukte bewerkingen opnieuw wilt proberen, kan een taakwachtrij een betere oplossing zijn.

Verwar de cron-dienst van het systeem ook niet met WP-Cron in WordPress. WP-Cron controleert geplande taken standaard bij verzoeken aan de website. Bij weinig verkeer kan de uitvoering daardoor vertraging oplopen.

Begin met het automatiseren van een niet-kritieke taak en leg de resultaten vast in een logbestand. Laat de automatisering pas gegevens verwijderen of back-ups maken nadat je hebt bevestigd dat ze daadwerkelijk het gewenste resultaat oplevert.

Zie ook: Wat is 2FA?

Lees ook

Lees hoe PHP-FPM PHP-verzoeken verwerkt, verschilt van een webserver en hoe je processen afstemt op verkeer en hostingcapaciteit.
Ontdek hoe BIND als open DNS-serversoftware domeinen beheert, welke rollen het vervult en wanneer zelf beheren zinvol is.
Lees wat het Poolse REGON-register en -nummer betekenen, hoe ze verschillen van NIP en KRS en hoe je bedrijfsgegevens controleert.