CRON

Voer commando's uit volgens een bepaald schema.

Als je bepaalde taken volgens een bepaald schema wil laten uitvoeren dan is cron dé tool die je zoekt. Dit is een door veel Linux en Unix systeembeheerders gebruikte tool.

Hieronder ga ik een simpel voorbeeld geven van een automatische backup van de broncode van deze website.

In dit voorbeeld maak ik gebruik van de tool rsync. Indien deze nog niet op jouw systeem geïnstalleerd is, zal je dat als eerste moeten doen. Op een op Debian gebaseerd systeem is het commando hiervoor $ sudo apt install rsync.

Laten we beginnen.

Indien cron niet standaard geïnstalleerd is op je systeem dan moet je dit ook eerst nog installeren ($ sudo apt install cron).

Het is ook mogelijk dat je na installatie cron nog moet "aanzetten" (enabelen) dit doe je (op een systeem met systemd) met : $ sudo systemctl enable cron.

Eerst moeten we het "crontab" bestand aanpassen, en net zoals bij sudo is er hiervoor een speciaal commando: crontab -e dit opent de crontab in een tekst editor (vi in mijn geval)

Figuur 1. $ crontab -e
$ crontab -e

Dit is een leeg crontab bestand, met uitleg over hoe je cron moet gebruiken1.

Hoe ziet een correcte cronjob zoals ze dit noemen er nu uit?

  • m : minuut (bijv. 5 is 5 minuten na het uur).
  • h : uur (bijv. om 13 uur).
  • dom : dag van de maand (bijv. 1).
  • mon : maand (bijv. 4).
  • dow : dag van de week (bijv. 6 = zaterdag, 0 = zondag)
  • command : het uit te voeren commando.

Als je een recente versie van cron hebt, kun je ook enkele speciale commando's gebruiken bijvoorbeeld:

Tabel 1. Speciale syntaxis
Speciale Syntaxis Reguliere Syntaxis
@hourly (ieder uur) 0 * * * *
@daily (dagelijks) 0 0 * * *
@weekly (iedere week) 0 0 * * 0
@monthly (iedere maand) 0 0 1 * *
@yearly (ieder jaar) 0 0 1 1 *

Voorbeeld: Ik wil iedere zaterdag om 12 uur 's middags een backup uitvoeren van mijn Projects directory naar mijn NAS:

0 12 * * 6 rsync -a /home/patrick/Projects /media/NAS/Backup/

Het sterretje geeft aan dat ik iedere dag en iedere maand het commando wil laten uitvoeren.

Maar wat als ik nu wil dat deze backup niet 1 keer per week, maar om de 10 minuten wil laten uitvoeren? Dit kan ik bij m toch niet aangeven? Voor deze gevallen gebruiken we: */10. Dus in mijn voorbeeld:

*/10 * * * * rsync -a /home/patrick/Projects /media/NAS/Backup/

Als we de text editor nu afsluiten zien we het volgende:
Figuur 2. $ crontab -e
$ crontab -e
Oeps, een foutmelding. Laten we deze eens van dichterbij bekijken:
  • no crontab for patrick - using an empty one ...: Dit geeft gewoon aan dat er nog geen crontab bestand bestaat voor deze gebruiken en is in princiepe dus geen foutmelding.
  • "/tmp/crontab.LlmnW8/crontab":23: bad minute errors... : Dit is echter wél een fout en er wordt ook aangegeven waar deze fout gebeurd is. nl. bij het instellen van de minuten.
  • Do you want to reply the same edit? (y/n): Omdat er een fout zit in mijn commando is het aangewezen om hier op y de drukken en de fout op te lossen.
De fout in de crontab was dat ik I.p.v. */10 0/10 had geschreven en dat is dus een typefout. Na het verbeteren van deze fout krijgen we de melding dat de nieuwe cronjob is toegevoegd:
Figuur 3. $ crontab -e
$ crontab -e

We krijgen nu de melding "crontab: installing new crontab", we hebben dus met success een periodieke backup (iedere 10 minuten) van de directory /home/patrick/Projects naar /media/NAS/Backup.

Zoals je ziet is het redelijk gemakkelijk om met cron automatisering toe te passen, zo kun je ook een commando toevoegen waarmee je (bijvoorbeeld) dagelijks een update van je systeem uitvoert. Dit is wel niet altijd aan te raden, want dan moet je in het commando aangeven dat je altijd akkoord gaat met de voorgestelde wijzigingen en soms (vooral bij op Debian gebaseerde systemen waarop je sudo apt update && sudo apt dist-upgrade -y zou gebuiken) kunnen die wijzigingen voor problemen zorgen. Dit tegenwoordig wel hoofdzakelijk het geval bij gebruik van dist-upgrade omdat dit commando bij conflicten programma's kan verwijderen (iets wat bij een "gewone update niet gebeurd).

Als je wil kijken of er cronjobs geprogrammeerd zijn op het systeem kun je in plaats van het commando crontab -e een ander commando crontab -l gebruiken:

Figuur 4. $ crontab -l
$ crontab -l

Meer informatie is te vinden in de manpages of de infopages.

1 Je kunt zoveel "cronjobs" toevoegen als je zelf wil. (1 regel per cronjob).