2.7. Crontab

Crontab er et smart system til automatisk at køre programmer på givne tidspunkter, såsom daglig backup. Det er en standarddel af et Unix-system og er derfor altid med i Linux. Man kan få kørt vilkårlige programmer på vilkårlige tidspunkter, f.eks. hvert minut, hver time, hver dag, ugedag eller månedsdag.

Crontab-filerne omfatter /etc/crontab, /etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly og /etc/cron.weekly, samt cron-filer til systemets brugere i /var/spool/cron/tabs.

Syntaksen for crontab-filerne er den samme: En kommando pr. linje og i rækkefølge fra venstre mod højre, minut (0-59), time (0-23), månedsdag (0-31), måned (0-12), ugedag (0-7, hvor 0 og 7 begge er søndag) og endelig den kommando du vil have udført. Hvert felt adskilles af et mellemrum, og hvis man vil have, at programmet køres alle dage, så indsæt en "*" for månedsdag og måned. En kommando kan udføres f.eks. hvert 5. minut med "*/5 * * * *" og til et tids-interval bruges "-" som "1-5" for mandag til fredag. Flere tidspunkter adskilles med ",".

Ofte udløser en crontab-kommando en email til root. Det kan være uheldigt med mange emails til root, som blot fortæller, at systemet opfører sig normalt. Hvis linjen afsluttes med >/dev/null 2>&1 sendes meddelelsen i stedet ud i intetheden.

Vi giver nu et eksempel, hvor vi hver morgen kl. 7 fra mandag til fredag sender brugeren "root" et brev med oplysninger om hvor meget belastning der er på maskinen.


0 7 * * 1-5 uptime | mail root

Brug man -a crontab til at læse mere om crontab. Skift til næste man-fil ved at trykke 'q'. Kommandoen man 1 crontab fortæller om administration af crontab-filer og man 5 crontab om indholdet i crontab-filerne.

2.7.1. /etc/crontab

Systemadministrator kan skrive kommandoer direkte i filen /etc/crontab. For at opretholde adskillelsen imellem systemet og brugerne, bruger administrator normalt også en fil i /var/spool/cron/tabs.

I /etc/crontab er defineret, hvordan der køres jobs hver time fra /etc/cron.hourly til tilsvarende hver dag, uge og måned via /etc/cron.daily, /etc/cron.monthly og /etc/cron.weekly.

Skriver administrator kommandoer direkte i /etc/crontab, skal brugernavnet, som kommandoen skal udføres under, angives efter de 5 tidspunkts-kolonner og før selve kommandoen.

2.7.2. /etc/cron.daily, hourly, monthly, weekly

I de 4 biblioteker under /etc kan systemadministrator placere scripts, som skal udføres på givne tidspunkter. Afviklingstidspunktet styres i /etc/crontab, så selve scriptet skal ikke indeholde oplysninger om tidspunkt, og da der er en fil til hver opgave, må scriptet brede sig over flere linjer.

2.7.3. Brugernes crontab-filer

Den almindelige bruger har ikke adgang til /etc/crontab. Kommandoer, de vil have kørt på et givet tidspunkt, lægges i filer med brugerens navn i /var/spool/cron/tabs. Ofte bruger systemadministrator også denne fil.

Med crontab -e kan brugeren skrive direkte i filen, men bl.a. for at kunne bruge sin normale editor i stedet for at være tvunget til at bruge vi, er det normalt at skrive en kladde i en almindelig tekst-fil (oftest med navnet .crontab i sit hjemmekatalog), og køre kommandoen crontab ~/.crontab.

I stedet for de 5 tidsangivelser kan linjen starte med '@reboot', hvorefter den udføres når systemet genstartes. Denne mulighed virker ikke for kommandoer, som er skrevet direkte i /etc/crontab.

2.7.4. Kør ikke-gentagne jobs med at

Som det er forklaret i de forrige afsnit så vil crontab primært anvendes til at køre automatiske scripts eller egentlige programmer på fastlagte tidspunkter gentaget hver time, dag, uge eller måned.

Nogle gange har man desuden brug for at køre programmer en enkelt gang, men man har måske ikke mulighed for selv at starte programmet på det tidspunkt man ønsker. Det kunne være at man lige ville starte en ekstra backup midt i den kommende nat. Linux-maskinen har ligesom andre UNIX-maskiner mulighed for at køre programmer når man selv ønsker dette. Vil man køre en kompleks serie af kommandoer bør man skrive kommandoerne ind i en fil, men ellers er den almindelige måde at indskrive kommandoerne interaktivt. Hvis vi gerne vil vide hvem som er logget ind på maskinen kl. 03:00 og hvor meget hukommelse der er brugt på maskinen på det tidspunkt, dvs. man vil gerne køre who > ~/login_info.txt kl. 3 om natten og næste morgen kan man lige gennemse filen ~/login_info.txt. Derudover vil man gerne lige køre free, der viser hvor meget af den fysiske hukommelse samt swap-filen der er brugt. Dette gøres ved at køre kommandoen free.

Kommandoerne indskrives efter at man skriver at og tidspunktet. Antallet af kommandoer, som indskrives på de efterfølgende linjer en for en, er ikke begrænset. Kommandoerne afsluttes med Ctrl-d på en linje for sig.


[tyge@hven ~]$ at 3:00
at> who > ~/login_info.txt
at> free >> ~/login_info.txt
at> Ctrl-d

Næste morgen vil filen ~/login_info.txt indeholde følgende:


 3:00am  up 23:03,  8 users,  load average: 0.00, 0.04, 0.08
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT
pto      :0       console          Sat 2pm   ?     0.00s   ?     -
pto      pts/0    -                Sat 2pm 14:03m  0.00s   ?     -
pto      pts/2    -                 2:17pm  2:57m  3.45s  0.56s  /bin/bash
pto      pts/3    -                 1:21pm  8:18m  0.10s  0.10s  /bin/bash
pto      pts/4    -                 2:26pm  8:06m  0.52s  0.07s  bash
pto      pts/5    -                10:36pm  1.00s  0.27s  0.27s  /bin/bash
pto      pts/6    -                10:37pm  2:07   1.61s  1.51s  pine
             total       used       free     shared    buffers     cached
Mem:        190896     185820       5076          0      37244      76432
-/+ buffers/cache:      72144     118752
Swap:       329324      19936     309388

De sidste fire linjer kommer fra free og de første kommer fra who. Eksemplet illustrerer at det er nemt at anvende at, og det skal nævnes at hvis kommandoerne der udføres bringer tekst til stdout (standard output - dvs. tekst til skærm), så vil dette blive sendt som epost til brugeren.

Dette kan udnyttes sammen med en af de andre gode ting ved at. Hvis man gerne vil undgå at glemme den kaffe man lige har sat over, kan man få at til at sende sig en besked om 10 minutter med:


[tyge@hven ~]$ at now+10min
at> echo Kaffen er klar.
Man kan selvfølgelig også finde på mere seriøse anvendelser.

Har man brug for at se hvilke kommandoer man har i at-køen kan atq anvendes. Vil man slette jobs, da gøres dette med atrm. Endelig kan det nævnes at Linux-maskiner også har en batch-funktion, der fungerer som at, men er designet til at køre jobs, når der er ledig CPU-plads på maskinen. Det er efterhånden de færreste som anvender dette.