Crontab

Allikas: Kuutõrvaja
Redaktsioon seisuga 17. november 2010, kell 16:03 kasutajalt Jj (arutelu | kaastöö)

Sissejuhatus

Tihti on arvutis vaja perioodiliselt käivitada ühte või teist programmi. Musternäiteks on kasutajate kodukataloogide arhiveerimine või kui näiteks teie serveril on dial-up ühendus välismaailma püsiühendusega maili serveriga ning oluline on kirju vahetada kindlatel kellaagadel. Aga võib ka naljapärast näiteks iga veerandtunni tagant lasta arvutil ütelda, mis kell on. Selleks on vaja ka helikaarti, aga kellel tänapäeval helikaarti pole :)

Viimane aeg on ütelda, et OS'iga suhteliselt standartsena kaasapandav bootimisel käimatõmmatav vaim nimega crond tegeleb aja möödumise jälgimise ja sellele vastavalt reageerimisega. Kuidas konkreetselt reageerida, vaatab crond järele nn crontab'i failidest.

Kuidas crond töötab

Iga kasutajaga on seotud crond'ile olulises kataloogis /var/spool/cron/crontabs üks fail, mis kannab kasutaja nime ja kasutajal on õigus selle sisu redigeerida. Selle sisu muudetakse mitte vahetult, vaid käsuga crontab -e (fail on root'i oma; nagu /etc/passwd).

root'ile pole kurjast aeg-ajalt neid crontab faile sirvida, mitte sisulistel vaid tehnilistel kaalutlustel. Seda saab teha näiteks

# crontab -l imre

Niisiis, crond kasutab nn crontab'i faile, et teada kuna, millised ja kelle õigustes programm käivitada.

Oletame, et kasutaja imre tahab, et iga päev kell 11.45 hommikul mängiks arvuti muusikapala. Selleks tuleb tal editeerida sellise sisuga crontab:

$ export VISUAL=/usr/bin/joe
$ crontab -e
45 11  * * * /usr/local/bin/mpg123 /usr/data/mp3/muusikapala.mp3

Siin kangemad mehed, kes on harjunud kasutama vi'd ei pruugi vaikimisi editoriks joe'd defineerida, aga mulle on see harjumuspärasem.

Ja enne selgitusi ka teine näide:

Olgu soov kirjutada kuhugi faili mingil põhjusel iga 10 minuti tagant, kes süsteemis sees on, kasvõi näiteks põhjusel leida üles kõige suuremad kasutajad, kuigi selleks on tõenäoliselt ka muid võimalusi.

*/10 *  * * * /usr/bin/w >> ~/keson

crontab'i süntaksi selgitus

crontabis koosnevad sissekanded ridadest, kus on nn 6 välja (kokku mitte pikem kui 1 024 sümbolit reas)

#iga kuu 1. 10. ja 20. kuupäeval kell 2 hommikul; samuti esmaspäevadel
#väljund liita faili ~/kellaaeg
#minute   hour     day         month  dayofweek     command
#minut    tund     kuupäev     kuu    nädalapaev    käsk
 0        2        1,10,20     *        mon         date >> ~/kellaeg

Kui näidata ära nii kuupäev kui ka nädalapäev, siis need nö OR'takse, st tegevus sooritatakse, kui klapib kas nädalapäev või kuupäev või mõlemad.

Iga poole tunni tagant kogu aeg

#sama asi
minut    tund     päev     kuu    nädalapäev   käsk
 */30     *        *        *        *       date >> ~/kellaeg

#iga viie minuti tagant tööpäeviti
minut    tund     päev     kuu     nädalapäev    käsk
 */5      *        *        *       mon-fri      date >> ~/kellaeg

#iga päev kell 9:30, 10:30, ... 16:30 ja 21:30
minut    tund     päev     kuu    nädalapäev    käsk
 30   9-17/2,21    *        *         *         date >> ~/kellaeg 2>&1

Veel tuleb mainida, et viimases näites on kogu väljund, st ka võimalikud vead (stdoutja stderr), suunatud faili. Kui programmi täitmisel tekib stdout või stderr ning sellega midagi ette ei võeta, siis saadetakse töö omanikule sendmail'iga kiri, kus on see väljund sees.

Muide, crontab'i käsud on soovitav anda pika teega;, sest kui crontab käivitab mõne programmi kasutaja õigustes, siis on PATH piiratum kui muidu on kasutaja end tavaliselt sisse loginud.

Lõpuks, kui crontab'i süntaks tundub olevat ebapiisav, siis alati on võimalik tõmmata crontab'ist esiteks script üles, mis enne kõnealuse töö käivitamist teeb näiteks veel täiendava kontrolli arvuti koormuse ja aja suhtest.

Häälestus

Vaikimisi saadetakse kõik croni skriptide poolt tekitatud teated administraatori mailile, selle väljalülitamiseks tuleb hääleka käsu järele monteerida

>/dev/null 2>&1

Kui cron teatab midagi sarnast

error: gpg required but not found!

Tuleb modiditseetida path muutujat, lisades sinna erinevaid algallikaid kust tarkvara otsitakse nt

PATH=/usr/bin:/usr/sbin:/usr/local/bin

at

See on sarnase funktsiooniga programm (õigemini öeldes komplekt programme, aga tegelikult vist hard linke :)), erinevusega, et sooritab ühekordselt ettemääratud töö tulevikus. Ilmselt saab ka nii teha, et peale tolle töö sooritamise ta annab süsteemile teada uuest at'ist jne.

Aga käske antakse nii:

käskude fail 'kasud':

cal >> /home/imre/proov/kalender

(ehk on too fail igaks juhuks hea enne touch'iga valmis teha ja veenduda, et õigused on sobivad)

ning seejärel käsk

bash# at -f kasud now + 1 minute

näitab süsteemile, et asi läheb sappa (queue'sse)

ning nii saate näha, mis tööd on queue's:

bash# atq
Date                    Owner   Queue   Job#
08:52:00 03/19/99       root    c       10

Seda, kas kasutajatele ja kui, siis millistele kasutajatele, anda at' imise õigus, saab määrata failidega /etc/at.allow ja /etc/at.deny.

Queue'id on tegelikult a - z ja A- z. Neil on erinev prioriteet, mida peaks samuti arvestama.