Opdrachten automatiseren met cron

      Reacties uitgeschakeld voor Opdrachten automatiseren met cron

Cron is een tool om opdrachten automatisch op een bepaalde datum of tijdstip te laten uitvoeren. Bv. precies om 13:00u of, meer relatief, om de zoveel tijd, bv om de 30 minuten.

Cron is bedoeld voor het uitvoeren van regelmatig terugkerende taken, meestal onderhoudstaken, bv back-ups, of checks. Maar je kunt er ook bestanden van internet  of e-mail op vaste tijdstippen of met reguliere intervals mee downloaden. Cron is niet bedoeld voor eenmalig taken, daarvoor kun je het beste de tool ‘at’ gebruiken.

Inhoud

Cronjob
De syntaxis van een cronjob
Een paar voorbeelden van cronjobs
Speciale cronjobs die het leven makkelijker maken
Pas op
Loggen
Links

Cronjob

Een cronjob is een opdracht in de scheduler cron. Je kunt in cron meerdere cronjobs zetten, gewoon door elke job op een nieuwe regel onderaan in het bestand crontab te typen. Je opent crontab voor editing met het volgende commando:

crontab -e

De eerste keer dat je dit commando uitvoert, moet je een editor kiezen (kies bij voorkeur nano). Overigens is bovenstaand commando voor cronjobs die je aanmaakt via een bepaald account. Die jobs worden dan alleen uitgevoerd als de computer in dat account is opgestart (bij de Raspberry Pi is dat meestal het standaard gebruikersaccount ‘pi’). Als je een cronjob wil maken die altijd uitgevoerd wordt, ongeacht met welk account de computer is opgestart, dan gebruik je de superuser:

sudo crontab -e

Je zult dus zien dat de opdrachten die je via het eerste commando in crontab hebt aangemaakt, niet voorkomen in de crontab van het tweede commando (en omgekeerd).

De syntaxis van een cronjob

In het bestand crontab zelf staat een beknopte uitleg over het gebruik van cron en crontab. Elke cronjob begint op een nieuwe regel en heeft deze vorm:

* * * * * commando

De sterren (met spaties ertussen) staan voor: minuut, uur, dag, maand, weekdag. Het commando kan elk bash-commando zijn van één regel. Bijvoorbeeld: ./startscript.sh of: python Scripts/test.py.
Ingewikkelde commando’s kun beter in een uitvoerbaar bash-script (.sh) zetten.

Een paar voorbeelden van cronjobs

Een opdracht elke minuut uitvoeren:
* * * * *
Elk uur (dwz telkens op de nulde minuut):
0 * * * *
Om de 10 minuten (dwz op elke tiende minuut):
*/10 * * * *
Elke 2 uur (of elk even uur):
0 */2 * * *
Elke dag (om middernacht):
0 0 * * *
Elke dag om 08:00u:
0 8 * * *
Alleen op werkdagen (om middernacht):
0 0 * * 1-5
Elke zaterdag:
0 0 * * SAT
Elk weekend (zaterdag en zondag om middernacht):
0 0 * * 6,0
Een keer per maand (om middernacht van dag 1):
0 0 1 * *
Tussen twee tijdstippen (bv tussen 9:00 en 17:00u):
0 9-17 * * *

Speciale cronjobs die het leven makkelijker maken

Met het onderstaande regeltje in crontab start je elke keer bij het booten een python-programma:
@reboot python /home/pi/mijnscript.py
mijnscript.py draait vervolgens op de achtergrond met een proces-id (PID), een uniek nummer. Met dit nummer kun je het proces op elk moment direct stopzetten via het kill-commando:

(sudo) kill 19628

Met het onderstaande commando krijg je een lijst van alle draaiende python-programma’s en hun PID’s:

ps -fe | grep python

Op dezelfde manier als @reboot kun je ook de volgende opties gebruiken (bijvoorbeeld voor een back-upprogramma of systeemcheck):
@hourly (op elke nulde minuut)
@daily (om middernacht)
@weekly (op 00:00 op zondag)
@monthly (op 00:00 van dag 1 van elke maand)
@yearly (op 00:00 van 1 januari)
@annually (op 00:00 van 1 januari)

Pas op

Een stevige waarschuwing: als je je cronjobs verkeert configureert, krijg je geen foutmelding te zien. Dan werken je opdrachten gewoonweg niet of door elkaar heen of er starten meerdere instanties van hetzelfde script. Controleer daarom altijd welke scripts er (op de achtergrond) draaien door hun processen in de gaten te houden. Voor python-scripts kan dat zo:

ps -fe | grep python

Loggen

Om te zien of een cronjob succesvol is gestart, kun je kijken in het bestand /var/log/syslog:

grep CRON /var/log/syslog

Om de echo-regels van een bash-script te zien, kun je de regel van je cronjob uitbreiden zodat de output in een bestand terecht komt:

$ crontab -e
0 0 * * * /home/pi/bin/backup.sh >> /home/pi/logs/backup.log 2>&1

crontab.guru