24. december

Lad computeren arbejde for dig

crontab

En af de væsentligste kommandoer på ethvert unix-system er "crontab", der bruges til at sørge for at systemet automatisk kører bestemte kommandoer på bestemte tidspunkter. Det kan for eksempel være for at få taget daglige sikkerhedskopier, for at holde sin registrering i "Linux Counter" ved lige, eller for at sende sine tilføjelser til Ispells ordliste til Den Store Danske Ordliste.

"crontab" bruger en fil man typisk kalder sin "crontab-fil" til at holde styr på hvilke kommandoer, der skal køres hvornår. Filen kan sådan set hedde lige hvad det skal være, men det er meget almindeligt at give den navnet ".crontab" og at lade den ligge i sit hjemmekatalog. Hver linie i crontab-filen består af fem felter med information om de relevante tidspunkter efterfulgt af den kommando, der skal køres på de angivne tidspunkter. De fem felter er:

  1. Minuttal (0-59)
  2. Time (0-23)
  3. Dag (1-31)
  4. Måned (1-12)
  5. Ugedag (0-7, hvor 0 og 7 er søndag)

Et felt kan helt enkelt være en asterisk (*), hvilket står for alle de mulige værdier for det felt. Alternativt kan det være enkelte tal, et interval som for eksempel "8-16", eller lister som for eksempel "8,10,12-17". Hvis man for eksempel kun er interesseret i at noget sker for hver 3. mulige værdi skriver man "*/3".


Jeg har blandt andet følgende linie i min crontab-fil:

30 18 * * * /home/sparre/bin/dictionary_feedback

Den betyder at hver gang vi passerer kl. 18:30 - uanset dag, måned eller ugedag - skal kommandoen "/home/sparre/bin/dictionary_feedback" køres (det er den der sender mine tilføjelser til Ispells danske ordliste til Den Store Danske Ordliste).


Et andet eksempel fra min crontab-fil er:

*/5 * * * * /bin/df -k | /usr/bin/cut -c52- | /usr/bin/egrep '(100|9[4-9])\%'

I dette tilfælde bliver kommandoen kørt hvert femte minut ("*/5" i det første felt på linien) året rundt. Kommandoens opgave er at undersøge om der er fyldt mere end 93% på nogle af mine filsystemer. Hvis alle filsystemerne har mindst 7% fri plads skriver kommandoen ikke noget, men når pladsen kommer under 7% udskrives en advarsel.


Min lillesøster sætter pris på at få en frisk vejrudsigt fra Danmarks Meteorologiske Institut (DMI) på sin mobiltelefon, inden hun kører til og fra arbejde, så programmet "send_vejrudsigt" holder både mellem 5 og 7 om morgenen og mellem 15 og 17 om eftermiddagen øje med om vejrudsigten for København og Nordsjælland opdateres:
*/5 5-6,15-16 * * 1-5 /home/sparre/bin/send_vejrudsigt

Der er ingen grund til at slå op på DMI's websted oftere end hvert femte minut ("*/5" i første felt) og af en eller anden grund er det kun mandag til fredag ("1-5" i femte felt) det er interessant med en vejrudsigt.


Bemærk at det tilsyneladende altid er nødvendigt at angive den fulde sti til de programmer, der skal køres. Den kan du finde med kommandoen "which". Det er kommandofortolkeren "/bin/sh", der bruges til at køre kommandoerne i crontab-filen, så omadressering af kommandoernes fejlrapporter til almindeligt uddata sker med "2>&1".

Når du nu har skrevet en crontab-fil (eller rettet i den du havde i forvejen), så skal dens indhold registreres i systemet, før det får effekt:

~/> cat .crontab
*/5 * * * * /bin/df -k | /usr/bin/cut -c52- | /usr/bin/egrep '(100|9[4-9])\%'
~/> crontab .crontab
~/>

Du kører altså kommandoen "crontab" med din crontab-fil som det eneste argument, når du vil registrere crontab-filens indhold i systemet. Du kan også skrive direkte i systemets crontab-register med kommandoen "crontab -e". Så bliver dit standardtekstbehandlingsprogram (som angivet med systemvariablen "EDITOR" startet med en fil, hvis format er det samme, som når du skriver en separat crontab-fil.

Hvis du regner med at skulle kopiere din crontab-fil rundt til andre maskiner er det en fordel at have den liggende under dit hjemmekatalog. Ellers kan du lige så godt skrive direkte i systemets crontab-register.

Hvis du i stedet vil se hvad der lige nu er registreret i systemet kører du "crontab" med tilvalget "-l":

~/> crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/home/sparre/.crontab installed on Mon Dec  3 18:15:17 2001)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
*/5 * * * * /bin/df -k | /usr/bin/cut -c52- | /usr/bin/egrep '(100|9[4-9])\%'
~/>

Du er selvfølgelig meget velkommen til at tage et kig i SSLUG's julekalender fra 2000 (og i den fra 1999).