Cron versus Crontab
Cron, waarvan de naam is afgeleid van het Griekse woord voor tijd: chronos, is een dienst/service of program welke te vinden is op de meeste Linux/Unix-achtige systemen en zorgt ervoor dat geplande taken automatisch uitgevoerd worden volgens een opgegeven schema, waar tijd en/of interval is bepaald voor iedere taak.
Cron (het programma) gebruikt hiervoor een configuratie bestand: Crontab. Het formaat van crontab is niet alledaags maar zeker niet onmogelijk om te begrijpen.
Cron is dus het “programma” en de crontab is de “lijst van taken”.
Als je dus taken wilt verwijderen, toevoegen of bewerken, dan zul je dus het crontab bestand moeten openen en bewerken.
Ad Blocking Gedetecteerd Vriendelijk verzoek om te overwegen Ad Blocking uit te zetten voor onze website.
We zijn afhankelijk van inkomen uit Advertenties om de website te kunnen draaien.
Je kunt ons ook op andere manieren ondersteunen (zie Ondersteun ons links bovenin).
De Korte Versie
OK, dus voor wie ongeduldig is, de korte versie voor wie ongeduldig is of dit artikel al eens eerder gelezen heeft:
Bewerk crontab met crontab -e
.
Of als je crontab handmatig wilt openen:
- Bewerk crontab met een eenvoudige tekst editor zoals “VI” of “nano” (globaal niveau:
/etc/crontab
of /etc/config/crontab
, of gebruikersniveau: ~/.crontab
).
- Laat cron weten dat er veranderingen zijn met
crontab /etc/config/crontab
, crontab /etc/crontab
of crontab ~/.crontab
.
OK … nu verder met de echte details …
Geheel op Eigen Risico …!
Het is eigenlijk niet nodig om het te zeggen, maar ik doe het toch: Denk na bij wat je doet – alles voor eigen verantwoording!
Merk Op:
– Het is aan te raden om met de crontab op gebruikers niveau te werken (~/crontab) maar dat is niet altijd een optie (NAS!).
– Maak altijd een backup van het crontab bestand voor je er in begint te prullen!
Locatie van het Crontab bestand
De locatie van het crontab bestand is voor de meeste systemen vergelijkbaar en zeker niet moeilijk te bepalen. Als je echter verder leest zul je ontdekken dat de locatie van het bestand niet echt belangrijk hoeft te zijn …
Linux gebaseerde systemen
Als eerste moet je bedenken dat Linux een multi-user systeem is en dus twee niveaus ziet: Globaal (voor het gehele systeem) en per Gebruiker (voor individuele gebruikers).
Globale cron taken zijn bijvoorbeeld rommel opruimen, klok bijstellen, etc.
Globaal: /etc/crontab
of /etc/config/crontab
.
Op gebruikersniveau praten we over taken die een individuele gebruiker automatisch wilt laten uitvoeren, zoals email ophalen, of een taak die we liever snachts laten lopen omdat het te veel resource trekt …
Gebruiker specifiek: ~/.crontab
Network Attached Storage apparaten
Bedenk dat de meeste betere NAS apparaten zoals van QNAP of Synology ook onder Linux draaien.
Voor deze apparaten werkt Cron natuurlijk ook, maar hier kijken we meestal naar globaal niveau, en je zult SSH moeten gebruiken om bij de shell te komen (bijvoorbeeld via “ssh admin@<NAS IP Address>” of een programma zoals PuTTY).
Op een QNAP vindt je crontab hier: /etc/config/crontab
.
QNAP stelt de volgende aanpak voor toevoegen van regels:
Regels toevoegen:
echo "1 4 * * * /share/custom/scripts/custom1.sh" >> /etc/config/crontab
echo "40 5 * * * /share/custom/scripts/custom2.sh" >> /etc/config/crontab
Herstarten van Cron:
crontab /etc/config/crontab && /etc/init.d/crond.sh restart
MacOS X
Ook MacOS X ondersteund cron – het is uiteindelijk ook gebaseerd op een Linux variant, of beter gezegd: FreeBSD variant.
Voor de Mac wordt echter een handmatig aangemaakte /etc/crontab
, mogelijk automatisch verwijderd na het herstarten van de computer, tenzij je sudo touch /etc/crontab
toepast.
Er wordt gezegd dat de gebruiker specifieke crontab (~/.crontab
) werkt als verwacht.
Windows
Microsoft Windows gebruikt Cron NIET. De Windows Task Scheduler vervult en vergelijkbare taak maar is natuurlijk niet compatibel met Cron. Wil je echter Cron onder Windows gebruiken, kijk dan eens naar de gratis CronW (werkt misschien niet onder nieuwere Windows versies) of PyCron,.
Ad Blocking Gedetecteerd Vriendelijk verzoek om te overwegen Ad Blocking uit te zetten voor onze website.
We zijn afhankelijk van inkomen uit Advertenties om de website te kunnen draaien.
Je kunt ons ook op andere manieren ondersteunen (zie Ondersteun ons links bovenin).
Crontab Bewerken
Verschillen in Cron Implementaties
Er is werkelijk een enorme hoeveelheid aan Cron variaties en natuurlijk werken ze niet allemaal exact hetzelfde..
Door de verschillende implementaties zijn er natuurlijk bepaalde niet echt “standaard” (voor zover er überhaupt een standaard is), zoals het gebruik van het vraagteken of de optie om het jaar als veld toe te voegen.
In dit artikel laten we de exotische opties buiten beeld. Mocht je meer willen weten, raadpleeg dan de website van de ontwikkelaar of kijk in handleiding op de computer d.m.v. het man commando:
man cron
man crontab
Crontab Openen
Crontab is een standaard platte tekst bestand, di je kunt bewerken met een simpele tekst editor zoals bijvoorbeeld “VI” of “nano“, beiden zijn op Linux gebaseerde systemen te vinden.
Je kunt dus de crontab handmatig openen met: nano /etc/crontab
Of, wat veel beter is, je kunt het bestand openen via Crontab zelf: crontab -e
De tweede optie, crontab zelf crontab laten openen, is veel beter en bespaard je de zoektocht naar het juiste crontab bestand.
“crontab -e” … Kies jouw eigen editor …
Het statement “crontab -e” gebruikt vaak standaard het programma “VI“, maar waarom zouden we “VI” gebruiken als de gewenste editor via de omgevingsvariable EDITOR kunnen opgeven? Ik gebruik zelf veel liever een programma zoals “nano“.
Het e.e.a. hangt wel een beetje van de shell die je beruikt …
Merk op dat Bash de meeste gebruikte shell is voor system die Linux, Unic, of FreeBSD gebaseerd zijn – inclusief de Mac.
Bash: export EDITOR=nano
C-Shell: setenv EDITOR nano
Voor bepaalde Cron versies, bijvoorbeeld voor BusyBox gebruikers, moeten we de omgevingsvariabele VISUAL gebruiken. Zie regel 319 in de BusyBox code als voorbeeld. Bedenk ook dat Busybox een van de meest gebruikte tools is, je vindt het in: NAS apparaten (zoals QNAP), Routers, Modems, Mobiele toestellen zoals telefoons en tablets, satelliet ontvanges en kabel TV boxen, etc.
Busybox: export VISUAL=nano
Tip : Als je niet precies weet wat gaat werken voor jouw computer of apparaat, probeer ze gewoon 1-voor-1 en kijk welke editor geopend wordt als je crontab -e
uitvoert.
Crontab Regels
Elke regel in crontab representeert een geplande taak, welke elk opgebouwd zijn uit 6 of 7 parameters die met spatie gescheiden zijn.
De optionele waarde, de gebruikersnaam, kan geplaatst worden tussen de “DagVanDeWeek” en “Commando” parameter die er voor zorgt dat een taak onder de naam van een gebruiker wordt uitgevoerd. Ik heb het zelf nooit (direct) gebruikt …
De eerste 5 parameters hebben betrekking op de timing, gevold door de optionele gebruikersnaam en natuurlijk het verplichte commando, commando’s of script wat uitgevoerd moet gaan worden.
Tip : Er is een behoorlijk aantal zogenaamde “cron generators” online beschikbaar, maar ik moet eerlijk zeggen dat ze allemaal met hun gebreken komen. Het geeft je echter een goede start als je iets wilt uitproberen. Een van de beter generators is die van EasyCron.
Algemeen formaat:
Minuten Uren DagVanDeMaand Maand DagVanDeWeek Gebruikersnaam Commando
Toegstane waarden
Parameter |
Waarden |
Alternatief |
Opmerkingen |
Minuten |
0 – 59 |
|
|
Uren |
0 – 23 |
|
Gebruik 24-uur notatie! |
DagVanDeMaand |
0 – 31 |
|
|
Maand |
0 – 12 |
JAN – DEC |
|
DagVanDeWeek |
0 – 6 |
SUN – SAT |
0 = Zondag, 6 = Zaterdah |
Gebruikersnaam |
Optioneel – Naam van de uitvoerende gebruiker |
Commando |
Correct shell commando |
Als een voorbeeld kijk eens naar de volgende crontab regel welke een backup script (/bin/backup.sh
) iedere nacht om 0:30 in de ochtend uit laat voeren:
30 0 * * * /bin/backup.sh
Speciale Tekens
In het voorbeeld zag je al een eerste speciale teken welke we kunnen gebruiken om de parameters extra aan te kunnen passen.
De volgende speciale tekens kunnen gebruikt worden voor de tijd gerelateerde parameters:
Speciale Tekens
Teken |
Lees als |
* |
Sterretje |
Elke (allemaal) |
/ |
Schuine Streep |
Stap grootte (elke) |
, |
Komma |
En (lijst) |
– |
Min-teken |
Tot (range) |
• Sterretje – Elke (allemaal)
We kunnen de “*” bijvoorbeeld gebruiken in de Month parameter, waar het dan “elke maand” betekend.
Tip : Een veel voorkomende fout met de “*” is dat men het sterretje alleenstaand gebruikt in de Minuten parameter – hierdoor wordt er misschien ongewenst iedere minuut een taak gestart, wat dus ongewenste systeem belasting kan veroorzaken.
• Schuine Streep – Stap Grootte (elke)
De “/” is vooral handig voor patronen.
Bijvoorbeeld: */2 in de DagVanDeMaan parameter wil zeggen dat we “elke tweede dag“.
Zo ook met */5 in de Minuten parameter, wat wil zeggen: “elke 5 Minuten“.
• Komma – En (Lijst)
Met de komma kunnen we een lijst opgeven …
Bijvoorbeeld 1,10,20 voor DagVanDeMaand wil zeggen dat we het commando willen laten uitvoeren op de “1ste, 10de, en de 20ste dag van de maand“.
• Min-teken – Tot (Range)
Het maken van een lijst van opvolgende nummers moet natuurlijk makkelijker kunnen en dat is precies waar we het min-teken kunnen gebruiken.
Als we 1-5 voor DagVanDeWeek opgeven, dan wordt het commando op “Dag 1 tot en met 5 van iedere week” uitgevoerd, in andere woorden “Maandag (1), Dinsdag (2), Woensdag (3), Donderdag (4) en Vrijdag (5) van ieder week“.
Voor een aantal parameters zijn er nog een aantal extra speciale tekens die we kunnen gebruiken …
• Laatste
Voor zowel DagVanDeMaan als DagVanDeWeek kunnen we “L” gebruiken als indicatie voor “Laatste“.
Voorbeeld:
3L voor DagVanDeWeek wil zeggen “Laatste Woensdag van de maand“,
L voor DadVanDeMaand wil zeggen “laatste dag van de maand“.
• Dichtstbijzijnde Werk Dag
DagVanDeMaand gevolgd door een “W” geeft de “dichtsbijzijnde Werk dag” aan.
Voorbeeld:
10W voor DayOfMonth wil zeggen “dichtsbijzijnde week dag van de 10de dag in de maand“.
Als dus de 10de een Zondag is, dan wordt de taak gestart op Maandag de 11de, als de 10de echter een Zaterdag is, dan wordt de taak op Vrijdag de 9de af gedraaid.
• Xde Weekdag van de Maand
DagVanDeWeek heeft de optie om met een “#” (hekje, hash of pound) de “Xde weekdag van de maand“.
Het hekje na een weekdag nummer, moet gevolgd worden door een een nummer, 0 – 5, welke aangeeft de hoeveelste keer deze weekdag in de maand voorkwam.
Voorbeeld:
6#3 wil zeggen “de 3de Vrijdag (6 = Vrijdag) van de maand“.
• Nieuwe Regel of Carriage return
In de Commando parameter, wordt een “%” als een “nieuwe regel” (of een carriage return) karakter (tenzij er een schuine streep voor geplaatst wordt).
Een veel voorkomende fout is dat men nij commando’s die op zichzelf al een procent teken hebben, men vergeet een schuin streepje te zeggen (escapen) voor het procent teken zoals hier aangegeven: “\%“.
Ieder procent symbool wordt vervander door een nieuwe regel als er geen schuine streep voor staat!
Voorbeelden
Zoals je uit de voorgaande voorbeelden misschien hebt kunnen zien: legio combinaties zijn mogelijk voor het instellen van een tijdstip of interval.
Hieronder een paar voorbeelden:
Crontab Voorbeelden
Crontab line |
What it does |
0 */2 * * * /bin/backup.sh |
Run backup.sh elke dag op elk even uur
Hier worden all uren (* = 1 tot 24) gebruikt, dus hebben we even uren. |
0 1-23/2 * * * /bin/backup.sh |
Run backup.sh elke dag op elk oneven uur
We hebben hier de uren beperkt tot 1 tot 23 waardoor we oneven krijgen. |
*/15 * * * * /bin/backup.sh |
Run backup.sh elke 15 minuten |
0 */6 * * * /bin/backup.sh |
Run backup.sh elke 6 uur |
0 0 * * 2 /bin/backup.sh |
Run backup.sh om middernacht op elke Dinsdag (2) |
0 12 1-15,17,20-25 * * /bin/backup.sh |
Run backup.sh om 12 uur ’s middags, op de 1st t/m de 15de, de 17de, en de 20st t/m de 25ste van elke maand |
* 12 10-16/2 * * /bin/backup.sh |
Run backup.sh om 12 uur ’s middags, op de 10de, 12de, 14de en 16de van elke maand |
* 12 10,12,14,16 * * /bin/backup.sh |
Dit is hetzelfde als de voorgaande: Run backup.sh om 12 uur ’s middags, op de 10de, 12de, 14de en 16de van elke maand |
0 0 * * 0,6 /bin/backup.sh |
Run backup.sh elke middernacht in elke weekend (Zondag = 0 en Zaterdag = 6) |
30 12 * * 1-5 /bin/backup.sh |
Run backup.sh elke werkdag om half 1 ’s middags (12:30, Maandag =1, Vrijdag = 5) |
0 5 1 */3 * /bin/backup.sh |
Run backup.sh elke eerste dag van het kwartaal (3 maanden) om 5 uur ’s morgens (5:00) |
0 0 22 10 * /bin/happybirthday.sh |
Run happybirthday.sh elke 22st Oktober van het jaar om middernacht. |
Voorgedefinieerde @ Afkortingen
Cron kent ook een aantal handige afkortingen:
Cron afkortingen
Afkorting |
Toepassing |
@reboot |
Commando uitvoeren als de computer or Cron herstart |
@daily |
Commando uitvoeren dagelijks om middernacht |
@midnight |
Hetzelfde als @daily – Commando dagelijks uitvoeren om middernacht |
@weekly |
Uitvoeren op elke Zondag om middernacht |
@monthly |
Uitvoeren om middernacht op elke 1st dag van de maand |
@yearly |
Uitvoeren om middernacht op elke 1st dag van het jaat (1 Januari) |
@annually |
Hetzelfde als @yearly |
Een voorbeel dat /bin/backup.sh
elke dag om middernacht uitvoert:
Omgevingsvariabelen
In Cron kunnen we een aantal omgevingsvariabelen definiëren. Ik gebruik ze zelf zelden (om verwarring te voorkomen).
Deze variabelen moeten als eerste in crontab gedefinieerd worden zodat Cron ze kan zien voor het uitvoeren van commando’s.
Cron Variabelen
Variable |
Voorbeeld |
Doel |
SHELL |
SHELL=/bin/bash |
Instellen welke Shell Cron moet gebruiken |
PATH |
PATH=/usr/bin:/bin:/usr/sbin |
Instellen van het zoekpad voor Cron |
HOME |
HOME=/ |
Instellen van de “thuis” directory van Cron |
MAILTO |
MAILTO=root |
Instellen wie de output als email gaat ontvangen |
eMail me de resultaten
Zoals je hierboven zag: we kunnen Cron een email laten sturen met de output resultaten.
We kunnen dit op twee manieren doen.
Als eerste door direct naar een gebruiker te sturen:
Of (afhankelijk van de Cron implementatie en systeem configuratie) naar een email adres:
Output – Naar een file of gewoon weggooien …
Output van individuele commando’s kunnen naar een specifiek bestand gestuurd worden.
In onderstaand voorbeeld wordt /bin/test.sh
elke dag om middernacht uitgevoerd en de output wordt in het bestand /etc/test.txt
gedumpt.
0 0 * * * /bin/test.sh > /etc/test.txt
Output kan ook gedempt worden, of in andere woorden, simpel weg gegooid worden.
0 0 * * * /bin/test.sh >/dev/null 2>&1
http://www.unixgeeks.org
https://help.ubuntu.com
http://www.markus-gattol.name
http://www.easycron.com
http://en.wikipedia.org/wiki/Cron
http://wiki.gentoo.org/wiki/Cron
Reacties
Er zijn 2 reacties welke je hieronder kunt lezen.
Je kunt jouw eigen opmerkingen plaatsen m.b.v. dit formulier, of een reactie op een bestaande opmerking plaatsen door op de "Beantwoorden" knop te klikken.
[…] deze functie willen draaien zodra een pagina geladen wordt (meer geavanceerde gebruikers kunnen een Cron job […]
[…] deze functie willen draaien zodra een pagina geladen wordt (meer geavanceerde gebruikers kunnen een Cron job […]