Crontab
Sisukord
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.
- http://www.cyberciti.biz/faq/howto-restrict-at-cron-command-to-authorized-users/ crontabi turvakaalutlustel piiramine teatud kasutajatele.