Crontab

Allikas: Kuutõrvaja

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 kellaaegadel. 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 standardsena 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 luua sellise sisuga crontab:

$ crontab -e

Ja sisestada:

45 11  * * * /usr/local/bin/mpg123 /usr/data/mp3/muusikapala.mp3

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)

#minut    tund     kuupäev    kuu     nädalapaev    käsk
(0-59)    (0-23)   (1-31)     (1-12)  (0-7)         (mingi unixi/linuxi käsk)

Nädalapäeva juures tasub silmas pidada, et 0 ja 7 on pühapäev, 1 on esmaspäev, 6 on laupäev jne. Crontabi rida mis iga kuu 1. 10. ja 20. kuupäeval kell 2 hommikul; samuti esmaspäevadel käivitab käsu "date" liites väljundi faili ~/kellaaeg näeb välja järgnev

#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

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

Iga tunni tagant

minut    tund     päev     kuu    nädalapäev   käsk
   0      *        *        *        *       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 skript ü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

Lisades crontabi algusse rea

MAILTO=myemailaddress@example.com

Saadetakse croni teated kindla(te)le mailiaadressitele (mailiaadressid tuleb eraldada komaga).

Crontabi muutujad

Crontab võimaldab kasutada regulaarsete tööde käivitamiseks ka muutujaid hourly, daily, yearly. Näiteks @daily käivitatakse iga kell 00:00.

Neile muutujatele vastavad järgnevad seadistused:

@yearly        0 0 1 1 *
@daily         0 0 * * *
@hourly        0 * * * *
@reboot        Run at startup.

Näiteks on võimalik kasutada @reboot käsku, et saata adminile teadet kui server tegi restardi:

@reboot root echo "masin bootis" | /usr/bin/mail -s reboot katk@eenet.ee

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.