Cronjob / crontab

Een Cronjob of beter bekend als crontab is een commando dat een programma of script op een ingesteld tijdstip uitvoert. Cronjobs worden gebruikt in Unix-achtige systemen als Linux, Debian of Raspbian. Het woord ‘cron‘ is afkomstig van het Engelse woord chronograph, dat een soort stopwatch is. Later is hier job (taak) en tab (kort voor tabel) aan toegevoegd. Een cronjob die een systeemservice draait wordt een deamon genoemd, dit zijn meestal servertoepassingen.

Cronjobs kunnen worden vergeleken met de taakplanner onder Microsoft Windows en werken exact hetzelfde. Voor wie cronjobs via de terminal lastig in te stellen vindt, zijn er verschillende programma’s met een grafische gebruikersomgeving (GUI) waarmee via een paar muisklikken een cronjob aangemaakt kan worden.

Syntaxis
Een cronjob wordt gemaakt met het commando crontab. Cronjobs kunnen de volgende tekens bevatten:

Speciale opties voor het crontab commando:

De cronjobs moeten worden ingesteld via de volgende volgorde:

<minuten> <uren> <dagen> <maanden> <weekdagen> <commando>

Het overzicht hieronder maakt duidelijk wat de mogelijke opties zijn.

Voorbeelden
Allereerst moet het script uitvoerbaar gemaakt worden door middel van chmod. Het script moet een header of meta tag hebben om de terminal of parser (een parser converteert de ingevoerde tekst in een datastructuur) te laten weten met wat voor bestand het te maken heeft. De allereerste regel van een script, de shebang, moet er als volgt uitzien:

#!/pad/naar/bash

of

#!/usr/bin/env python

Het formaat van de cronjob ziet er dan zo uit:

* * * * * /pad/naar/script

De bovenstaande code kan ook gecombineerd worden tot de volgende cronjob:

* * * * * /pad/naar/bash /pad/naar/script

Een voorbeeld
Hieronder staat een voorbeeld dat ik gebruik om een Python script te starten waarbij een bestand via FTP ge-upload wordt. Iedere 5 minuten wordt het python script upload_file.py gestart. Het beste kun je het pad van het bestand vanaf de root definiëren.

*/5 * * * * /usr/bin/python /home/pi/my_python/Ftp/upload_file.py

Cronmaker
Mocht je het lastig vinden om de opties voor cron vast te stellen?
CronMaker (http://www.cronmaker.com/) helpt je hierbij.

Start een taak bij reboot
Als je bij iedere reboot van de Raspberry Pi een taak wilt starten, gebruik je @reboot in plaats van de datum en tijd. Bijvoorbeeld:

@reboot python /home/pi/myscript.py

Deze regel start het Python script iedere keer als de Raspberry Pi herstart. Als je wilt dat het commando op de achtergrond loopt terwijl de Raspberry Pi nog opstart, voeg je een spatie en het &-symbool toe aan het einde van de regel, zoals hieronder:

@reboot python /home/pi/myscript.py &

Crontab bewerken
Bewerk crontab met crontab –e
Als je voor de eerste keer crontab wilt bewerken krijgt je de beschikbare editors te zien, maak hierin je keus.

pi@raspberrypi:~ $ crontab -e
no crontab for pi - using an empty one

Select an editor. To change later, run ‘select-editor’.
1. /bin/ed
2. /bin/nano <—- easiest
3. /usr/bin/vim.tiny
Choose 1-3 [2]:

Je kunt natuurlijk crontab ook handmatig openen met nano /etc/crontab

Bijzonder te noemen is dat er met beide methodes er een andere crontab opent.
crontab –e opent bestand: /tmp/crontab.4D2QXO/crontab
nano /etc/crontab opent bestand: /etc/crontab

Je bent nu in een editor waar je taken kunt opgeven of wijzigen (zie afbeelding). Wanneer je nog nooit cronjobs hebt toegevoegd ziet je crontab eruit als in onderstaande afbeelding.

of

Gebruik bij voorkeur crontab –e en kies nano als editor. 

Je kunt je wijzigingen opslaan door op je toetsenbord op ctrl-o te gebruiken. Met ctrl-x en [ENTER] sluit je de nano-editor. Als je nu de onderstaande regel te zien krijgt is je taak succesvol opgeslagen.

crontab: installing new crontab

Wanneer je snel wilt zien welke taken er gepland zijn, gebruik je het volgende commando:

crontab –l

Wanneer je alle taken wilt wissen, gebruik je het volgende commando:

crontab –r

Wat doet sudo crontab –e
$ sudo crontab is het root accounts van cron
$ crontab is het gebruikersaccount zoals jij, de gebruiker inlogt in crontab

Cron GUI
Er is ook een grafische toepassing voor Cron beschikbaar. Hiervoor dien je het gnome-schedule package installeren met:

sudo apt-get install gnome-schedule

Vervolgens kun je het programma Scheduled Tasks vanuit het hoofdmenu van de desktop opstarten door in de Terminal ‘gnome-schedule’ in te tikken.

Om een nieuwe taak te maken klik je op het New pictogram in de toolbar. Selecteer het taaktype dat je wilt maken. Meestal worden er taken aangemaakt die op vaste momenten starten. Om een terugkerend rooster te maken klik je de Recurrent task optie, geef de nieuwe taak een duidelijke naam en specificeer het commando of het script die je door de taak wilt laten uitvoeren. Standaard laat het programma de output van het commando of het script in een apart venster zien, je kunt dit uitschakelen door de optie Suppress output te kiezen. Gebruik dan de optie in de Time & Date sectie om het gewenste rooster te specificeren.

Mocht je meerdere jobs met dezelfde instellingen willen toevoegen, kun je de gecreëerde taak als een template bewaren. Op deze manier hoef je niet elke taak helemaal opnieuw te maken.

Om te controleren of de toegevoegde taak goed werkt, gebruik je de Run selected task knop. Deze kun je ook gebruiken om de taak op ieder gewenst moment te starten. Gnome Schedule heeft niet heel veel functies, het doet wat het moet doen en het maakt het makkelijk een geroosterde taak toe te voegen en te configureren.

Have A Nice Day!

2 Reacties

  1. Dag Anton, deze vraag hoor ik niet vaak. Wel interessant.

    Crontab is een tekstscript dat als batch ‘afgetrapt‘ wordt. Het bestand is in de terminal als tekstbestand te benaderen. Deze zou je kunnen kopiëren.

    Als je een crontab voor de gebruiker (jij) maakt, wordt deze uniek weggeschreven in de tmp-directorie, zoals /tmp/crontab.SaZVHR/crontab. Om de cron te activeren dient de Pi gereboot te worden. Na reboot wordt het nieuwe script binnen het systeem opgeslagen. Rechtstreeks benaderen ervan is niet toegestaan.

    Ik lees dat /var/spool wordt gebruikt voor crontabs per gebruiker. De systemjobs zijn binnen /etc/cron.d en ook /etc/cron.[hourly|daily|monthly].

    Wanneer sudo crontab -e, dus voor root wordt gebruikt, wordt de crontab opgeslagen in: /var/spool/cron/crontabs/root.

    Het bestand /etc/cron* wordt waarschijnlijk alleen voor systemd gebruikt.

    Om de crontab bestanden te vinden kun je het volgende commando ingeven: sudo find / -name ‘crontab*’

    Ik hoop dat ik je wat geholpen heb.

Reacties zijn gesloten.