# Ubuntu: Linux voor mensen/Processen/Het cron systeem
## Wat is cron?

De cron daemon draait constant op je systeem. Deze dienst gaat elke minuut na of er taken uit te voeren zijn voor de gebruikers of voor de diensten die op een systeem draaien. De taken worden opgeslagen in zogenaamde crontabs (tabellen). Elke gebruiker kan een crontab hebben, waarin elke lijn een taak voorstelt die regelmatig herhaald moet worden. Verder is er ook nog een crontab waarin de systeem-specifieke taken vernoemd worden, zoals bijvoorbeeld:
* Dagelijks de index maken waarvan het locate commando gebruik maakt;
* Dagelijks nagaan of er updates zijn voor de software op het systeem;
* Er dagelijks voor zorgen dat logbestanden, waarin informatie wordt opgeslagen over wat er allemaal op het systeem gebeurd is, niet te groot worden.
* Dagelijks en wekelijks een index maken van alle man pagina's, zodat apropos en whatis kunnen werken.
Andere taken kunnen zijn: het maken van backups, rapporten opmaken en doorsturen, systeeminformatie analyzeren en doormailen naar de administrator, herinneringsbrieven mailen, enzovoorts. Alle taken die periodiek uitgevoerd moeten worden, komen voor opname in het cron systeem in aanmerking.
De crontabs voor het systeem vind je in de /etc map, die van de gebruikers in /var/spool/cron/crontabs, maar die map is niet toegankelijk voor de niet-gepriviligieerde gebruiker. In /var/spool/cron vind je ook nog atjobs en atspool, omdat de at jobs onder de verantwoordelijkheid van de cron daemon vallen.

## Cron gebruiken

Om een crontab te kunnen maken, moeten we een editor kunnen gebruiken. Voorlopig zullen we de standaard teksteditor gebruiken, nano. Het is belangrijk om een tekst editor te gebruiken, en niet zomaar eender welke word processor. Die laatste gaat namelijk allerlei formateringsinformatie stockeren in het bestand dat je wilt schrijven, en daar kan ons systeem niet mee om. We moeten het bestanden geven waarin elk karakter leesbaar is en waarin elk karakter ingelezen kan worden zoals het zich voordoet, toch op zijn minst wanneer het configuratiebestanden betreft. Je kan je dit voorstellen als zou je met Notepad op MS Windows een Office document proberen te openen (.doc): Notepad ziet ook alle formateringsinformatie en kan er niet mee om, zodat je allerlei rare karakters op je scherm krijgt en haast niets van de eigenlijke tekst kan lezen.
Dus willen we een editor die geen extra informatie opslaat, een “WYSIWYG” of “What You See Is What You Get” editor. We zullen later zien dat nano niet de enige mogelijkheid is, en zeker niet de standaard op alle Linux systemen.

## De crontab bewerken

Om je persoonlijke crontab te editen, geef je het commando crontab -e in. Met de -e zal er een slot op het bestand in /var/spool/cron/crontabs/jouw_gebruikersnaam gezet worden, zodat je niet twee keer hetzelfde bestand kan editeren. Mocht dat slot er niet zijn, dan zou je je crontab kunnen beginnen schrijven, afgeleid worden en in een tweede terminal venster een nieuwe crontab openen, waarmee je de veranderingen van de eerste zou kunnen overschrijven.
Na het ingeven van dat commando krijg je een relatief leeg scherm, de nano editor heeft een nieuw, tijdelijk bestand voor je geopend.
Deze editor werkt zeer gemakkelijk, de mogelijke acties staan onderaan beschreven. Bijvoorbeeld om een bestand af te sluiten, staat er dat je “^X” moet ingeven. Het circumflex accent staat voor een combinatie met de Ctrl toets, je moet dus Ctrl+X ingeven om een bestand weg te schrijven.
Bij wijze van test zullen we elke 5 minuten een testbestand laten aanmaken in /var/tmp. Ga als volgt te werk:
* Geef daarvoor de volgende regel in:
* 0,5,10,15,20,25,30,35,40,45,50,55 * * * * touch /var/tmp/`date`
* Als je klaar bent, druk je Ctrl+X.
* Op de vraag of je de gemodificeerde buffer wilt bewaren, antwoord je met J.
* Aanvaard de voorgestelde plaats om het bestand te bewaren door Enter te drukken.
* Hiermee verlaat je de editor en kom je terug in de shell terecht. Je krijgt de boodschap:
* crontab: installing new crontab
* De /tmp map
* De /tmp map is voorbehouden voor het systeem en de programma's die erop draaien. Bijvoorbeeld editors gebruiken ze om tijdelijke bestanden op te slaan. Je kan echter nakijken met ls /tmp dat het crontab commando het bestand onmiddellijk naar /var/spool/cron/crontabs/willy versluisd heeft.
* Moet je zelf tijdelijk iets opslaan, bijvoorbeeld om iets af te halen van het Internet of om iets te testen, gebruik dan de map /var/tmp, die is voor dat doel voorbehouden. Deze scheiding is er omdat op vele systemen de map /tmp eigenlijk in het fysische geheugen zit, in plaats van dat het een map op de harde schijf is. Als je /tmp gebruikt op zo'n systemen, vul je dus eigenlijk het geheugen op en zal zo'n systeem sneller gaan swappen, wat voor enorme vertragingen kan zorgen. En als /tmp helemaal vol geraakt, kan dat voor vele programma's bovendien desastreuze gevolgen hebben. Op ons systeem loopt het niet direct zo'n vaart, maar je maakt er wel best een goede gewoonte van om je aan deze regel te houden. Zo kom je niet in de problemen wanneer je later op andere Linux of UNIX systemen gaat werken.
Gebruik het crontab -l commando om de crontab op het scherm te tonen:
* willy@ubuntu:~$ crontab -l
* 0,5,10,15,20,25,30,35,40,45,50,55 * * * * touch "/var/tmp/`date`"
We zien hier een nieuwe shell constructie in de laatste kolom, waar we de uit te voeren opdracht weergeven. Het zijn de zogenaamde backticks of grave accenten. Alles wat daartussenstaat zal uitgevoerd worden als commando. Het date commando geeft de datum weer:
* willy@ubuntu:~$ date
* ma jun 23 12:04:21 CEST 2006
Omdat er ook een uuraanduiding met seconden in voorkomt, kunnen we op die manier elke vijf minuten een nieuwe bestandsnaam maken. Indien we bestandsnaam bij touch gewoon /var/tmp/date zouden opgeven, zouden we elke vijf minuten hetzelfde bestand opnieuw aanmaken.

## Het tijdstip van uitvoering bepalen

Hoe weet cron nu wanneer een bepaalde taak uitgevoerd moet worden?
De cron daemon kijkt elke minuut alle crontabs en alle atjobs na. In de crontabs geef je het tijdstip op in de eerste vijf kolommen; zoals we reeds zagen volgt in de zesde kolom de uit te voeren opdracht. De kolommen hebben volgende betekenis:
* Eerste veld: de minuten na het uur waarop een taak uitgevoerd dient te worden. Mogelijke waarden zijn 0 tot en met 59.
* Tweede veld: het uur waarop een taak uitgevoerd moet worden. Mogelijke waarden zijn 0 tot en met 23.
* Derde veld: de dag van de maand waarop een taak moet uitgevoerd worden. Mogelijke waarden van 1 tot en met 31.
* Vierde veld: de maand van het jaar waarop een taak uitgevoerd moet worden. Mogelijke waarden van 1 tot en met 12.
* Vijfde veld: dag van de week waarop een taak uitgevoerd moet worden. Mogelijke waarden zijn van 0 tot en met 7, zowel 0 als 7 stellen zondag voor, zodanig dat er geen vergissingen kunnen optreden (maandag is altijd 1).
Gebruik het streepje om een doorlopende reeks op te geven, bijvoorbeeld 1-5 in het vijfde veld wil zeggen van maandag tot vrijdag.
Gebruik komma's om een onderbroken reeks op te geven, bijvoorbeeld zoals we net deden in het veld voor de minuten na het uur.
Gebruik een sterretje in het betreffende veld om aan te geven dat het commando uitgevoerd moet worden elke minuut, elk uur, elke dag, elke maand en/of elke dag van de week.

## Een taak deactiveren

Om een taak niet meer uit te voeren, open je opnieuw de editor met het commando crontab -e. Je crontab kan uiteraard meerdere geautomatiseerde taken bevatten. Ga met de pijltjestoetsen naar de te verwijderen taak, en zet er een hekje voor (#), bijvoorbeeld ons testje:
* # 0,5,10,15,20,25,30,35,40,45,50,55 * * * * touch "/var/tmp/`date`"
Verlaat de editor met Ctrl+X, antwoord met J en druk Enter.
Je zal de melding krijgen dat de crontab veranderd is. Doorgaans worden lijnen die beginnen met een hekje beschouwd als commentaar, maar ze worden niet door het programma, waarvoor ze bestemd zijn, ingelezen. Zo kan je een overzicht houden van veranderingen die je aan bestanden aanbrengt, of waarom je een bepaalde opdracht zus of zo hebt ingegeven. Op die manier kom je niet in de problemen wanneer je na lange tijd een configuratiebestand opnieuw moet editeren: je zal nog exact weten wat de bedoeling is als je er altijd voor zorgt om commentaar bij te schrijven.
Alternatief kan je natuurlijk ook gewoon de desbetreffende regel uit de crontab verwijderen en de crontab wegschrijven. Doe dit als je zeker bent dat je die taak niet meer zal moeten uitvoeren. Indien je ze nog wel ooit eens zal moeten uitvoeren, is het beter de commentaar-methode te gebruiken, dat bespaart typwerk op termijn.
* Scheduling
* Gebruik sleep om een herinnering te maken dat je pasta in tien minuten klaar is.
* Create an at job that copies all files in your home directory to /var/tmp within half an hour. You may want to create a sub-directory in /var/tmp.
* Make a cronjob that does this task every Monday to Friday during lunch.
* Check that it works.
* Make a mistake in the crontab entry, like issuing the nonexistent command coppy instead of cp. What happens upon execution of the task?