Časové spúšťanie úloh

linux_pas V pre­doš­lých čas­tiach sme sa ve­no­va­li prek­la­du jad­ra a vy­tvo­re­niu ten­ké­ho klien­ta. Bo­li to za­ují­ma­vé té­my, ale eš­te čas­tej­šie sa pou­ží­va­te­ľo­vi stá­va, že pot­re­bu­je vy­ko­ná­vať ur­či­tú čin­nosť v ur­či­tom ča­se. No a keď­že po­sa­diť sa s ho­din­ka­mi v ru­ke za klá­ves­ni­cu po­čí­ta­ča a v da­ný oka­mih, napr. o pol jed­nej v no­ci na Via­no­ce, spus­tiť žia­da­ný prí­kaz je nao­zaj veľ­mi ne­li­nuxové, v sys­té­me Li­nuxu exis­tu­jú dva nás­tro­je na ča­so­vé spúš­ťa­nie úloh. A ten­to­raz sa bu­de­me ve­no­vať tým­to nás­tro­jom.

Roz­de­le­nie nás­tro­jov
Aby sme správ­ne po­cho­pi­li, ako sa na­rá­ba so spo­mí­na­ný­mi nás­troj­mi, roz­de­lí­me si ich pod­ľa spô­so­bu čin­nos­ti. Aj z bež­né­ho ži­vo­ta vie­me, že ur­či­tú čin­nosť mô­že­me vy­ko­nať iba raz v ži­vo­te ale­bo mô­že­me chcieť, aby sa tá­to čin­nosť vy­ko­ná­va­la opa­ko­va­ne a pra­vi­del­ne. Ta­kis­to je to aj v Li­nuxe. Na opa­ko­va­né spúš­ťa­nie da­nej úlo­hy slú­ži prog­ram cron, na jed­no­ra­zo­vé spus­te­nie kon­krét­nej úlo­hy slú­ži prog­ram at.

Cron
Cron je veľ­mi moc­ný nás­troj, kto­rý sa na­chá­dza v kaž­dej li­nuxovej dis­tri­bú­cii a je ak­tív­ny pri kaž­dom štar­te sys­té­mu. Mô­že­me te­da po­ve­dať, že je to služ­ba. Za­čia­toč­ní­ci si ani po­riad­ne neu­ve­do­mu­jú prí­tom­nosť cro­nu, ale ten v sys­té­me je a poc­ti­vo vy­ko­ná­va sta­no­ve­né úlo­hy. Ne­zá­le­ží na tom, či ide o server ale­bo des­ktop. Už z in­šta­lá­cie je cron nas­ta­ve­ný tak, že vy­ko­ná­va údr­žbu ope­rač­né­ho sys­té­mu, ma­že ne­pot­reb­né do­čas­né sú­bo­ry a po­dob­ne. Z pou­ží­va­teľ­ské­ho hľa­dis­ka mô­že­me cron vy­uží­vať na auto­ma­tic­ké vy­ko­ná­va­nie zá­loh dát, od­osie­la­nie a pri­jí­ma­nie poš­ty, od­osie­la­nie SMS-iek o sta­ve server­a ale­bo jed­no­du­cho od­os­la­nie upo­zor­ne­nia, že má­me ísť na po­ra­du.

Pod­sta­ta čin­nos­ti prog­ra­mu cron
Pra­vi­del­ne kaž­dú mi­nú­tu si prog­ram cron po­zrie sú­bo­ry s úlo­ha­mi, a ak sa v niek­to­rom z nich na­chá­dza za­zna­me­na­ný ča­so­vý údaj zod­po­ve­da­jú­ci sku­toč­né­mu ča­su, de­fi­no­va­nú úlo­hu, pri­ra­de­nú ča­so­vé­mu úda­ju, vy­ko­ná.

Sú­bo­ry prog­ra­mu cron
Po­ve­da­li sme si, že prog­ram cron je v pod­sta­te služ­ba. Tú­to služ­bu za­bez­pe­ču­je dé­mon crond. Tak ako kaž­dú inú služ­bu aj tú­to mô­že­me ov­lá­dať prí­ka­zom servic­e crond s prís­luš­ným pa­ra­met­rom. Čo a ke­dy má cron vy­ko­nať, to sa na­chá­dza v sú­bo­roch s úlo­ha­mi, kto­rým mô­že­me ho­vo­riť aj de­fi­nič­né sú­bo­ry. De­fi­nič­né sú­bo­ry mô­žu byť ta­ké­ho­to ty­pu:

sys­té­mo­vý sú­bor
pou­ží­va­teľ­ský sú­bor
sys­té­mo­vé ad­re­sá­re

Sys­té­mo­vý sú­bor sa vo­lá cron­tab a je ulo­že­ný v ad­re­sá­ri /etc/.

Pou­ží­va­teľ­ské sú­bo­ry ma­jú ná­zov pod­ľa me­na pou­ží­va­te­ľa, kto­rý ich vy­tvo­ril. Me­no je ta­ké, ako je za­de­fi­no­va­né v sú­bo­re /etc/passwd. Ich ulo­že­nie nie je v kaž­dej dis­tri­bú­cii rov­na­ké, napr. v dis­tre Red Hat/Fe­do­ra je to sú­bor /var/spool/cron/, v Su­SE je to /etc/cron/tabs/ a v Slackware za­sa /var/spool/cron/cron­tabs/.

Pred­stav­me si pou­ží­va­te­ľa me­nom mior, pra­cu­jú­ce­ho na dis­tri­bú­cii Fe­do­ra Co­re. Je­ho de­fi­nič­ný sú­bor pre prog­ram cron bu­de /var/spool/cron/mior. Čas­to (a nes­práv­ne) sa tým­to sú­bo­rom ho­vo­rie­va pou­ží­va­teľ­ské cron­tab sú­bo­ry. Aby sme si ich ne­mý­li­li so sku­toč­ným sú­bo­rom /etc/cron­tab, bu­de­me pou­ží­va­teľ­ské sú­bo­ry na­zý­vať pou­ží­va­teľ­ské cron ta­buľ­ky.

Dô­le­ži­té je, že sys­té­mo­vý /etc/cron­tab aj pou­ží­va­teľ­ská cron ta­buľ­ka, nap­rík­lad /var/spool/cron/mior, ma­jú rov­na­kú štruk­tú­ru.

Štruk­tú­ra cron ta­bu­liek
Poz­ri­me sa na sú­bor /etc/cron­tab. Vo vý­pi­se č. 1 je je­ho ob­sah:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAIL­TO=root
HO­ME=/

# run-parts
01 * * * * root run-parts /etc/cron.hour­ly
02 4 * * * root run-parts /etc/cron.dai­ly
22 4 * * 0 root run-parts /etc/cron.week­ly
42 4 1 * * root run-parts /etc/cron.month­ly

Sú­bor je roz­de­le­ný do dvoch čas­tí: Pr­vá časť skrip­tu opi­su­je všeo­bec­né nas­ta­ve­nia. Pre­men­ná SHELL ur­ču­je pou­ži­tie prí­ka­zo­vý inter­pre­ter, v na­šom prí­pa­de je to bash. PATH je ces­ta pre prog­ram cron, aby ve­del, kde sa na­chá­dza­jú je­ho po­moc­né prog­ra­my. MAIL­TO od­ka­zu­je na pou­ží­va­te­ľa, kto­ré­mu má za­sie­lať e-mai­ly. Ob­sa­hom tých­to e-mai­lov je vý­stup prog­ra­mu, kto­rý bu­de cro­nom spus­te­ný. Jed­no­duch­šie po­ve­da­né, ak prog­ram ale­bo prí­kaz, spus­te­ný cro­nom v da­nom ča­se pou­ží­va štan­dard­ný vý­stup (na ob­ra­zov­ku), ob­sah toh­to vý­stu­pu bu­de pos­la­ný do e-mai­lo­vej schrán­ky pou­ží­va­te­ľa, v tom­to prí­pa­de roo­ta. HO­ME ozna­ču­je do­mov­ský ad­re­sár, v tom­to prí­pa­de ko­reň ce­lé­ho ad­re­sá­ro­vé­ho stro­mu.

Dru­há časť sú­bo­ru ob­sa­hu­je de­fi­ní­cie ča­su a po­ža­do­va­nej úlo­hy. Skla­dá sa zo sied­mich po­lo­žiek a jed­not­li­vé po­lož­ky sú od­de­le­né me­dze­rou:

Mi­nú­ta	Ho­di­na	Deň v me­sia­ci	Me­siac	Deň v týž­dni	Pou­ží­va­teľ	Prí­kaz (úlo­ha)

Po­lož­ka Mi­nú­ta (angl. mi­nu­te) mô­že na­do­bú­dať hod­no­ty od 0 do 59 a opi­su­je, v kto­rej mi­nú­te bu­de prí­kaz (úlo­ha) spus­te­ný.

Po­lož­ka Ho­di­na (angl. hour) mô­že na­do­bú­dať hod­no­ty od 0 do 23 a opi­su­je, v kto­rej ho­di­ne bu­de prí­kaz (úlo­ha) spus­te­ná. Uve­dom­me si, že ide o 24-ho­di­no­vý for­mát a 0 (nu­la) sym­bo­li­zu­je pol­noc!

Po­lož­ka Deň v me­sia­ci (angl. day of month – dom) mô­že na­do­bú­dať hod­no­ty od 1 do 31 (pod­ľa me­sia­ca) a opi­su­je, v kto­rom dni me­sia­ca bu­de prí­kaz (úlo­ha) spus­te­ný.

Po­lož­ka Me­siac (angl. month) mô­že na­do­bú­dať hod­no­ty od 1 do 12 a opi­su­je, v kto­rom me­sia­ci bu­de prí­kaz (úlo­ha) spus­te­ný.

Po­lož­ka Deň v týž­dni (angl. day of week – dow) mô­že na­do­bú­dať hod­no­ty od 0 do 7 a opi­su­je, v kto­rom dni v týž­dni ho­di­ne bu­de prí­kaz (úlo­ha) spus­te­ný. Hod­no­te 0 (nu­la) a hod­no­te 7 zod­po­ve­dá ne­de­ľa, hod­no­te 1 zod­po­ve­dá pon­de­lok a tak ďa­lej, hod­no­te 6 zod­po­ve­dá so­bo­ta.

Po­lož­ka Pou­ží­va­teľ (angl. user) ob­sa­hu­je me­no pou­ží­va­te­ľa, pod kto­ré­ho prá­va­mi sa bu­de prí­kaz (úlo­ha) vy­ko­ná­vať. Tá­to po­lož­ka nie je po­vin­ná a mô­že byť (a aj v pou­ží­va­teľ­ských cron ta­buľ­kách nao­zaj je) vy­ne­cha­ná.

Po­lož­ka Prí­kaz (angl. com­mand) ob­sa­hu­je ná­zov prí­ka­zu, prog­ra­mu ale­bo skrip­tu, kto­rý sa bu­de v da­ný ča­so­vý oka­mih spúš­ťať.

Ma­lý prík­lad
Pred­stav­me si, že chce­me prá­ve v pia­tok 24. de­cem­bra o 17. ho­di­ne a 25. mi­nú­te spus­tiť skript s náz­vom za­lo­ha, na­chá­dza­jú­ci sa v ad­re­sá­ri /usr/bin/, kto­rý s prá­va­mi roo­ta vy­ko­ná ar­chi­vá­ciu všet­kých kon­fi­gu­rač­ných sú­bo­rov v na­šom sys­té­me (ob­sah toh­to skrip­tu te­raz nie je pod­stat­ný). Po­tom by zá­pis v sú­bo­ru /etc/cron­tab vy­ze­ral tak­to:

25 17 24 12 5 root /usr/bin/za­lo­ha

Up­ra­ve­ný sú­bor ulo­ží­me a mô­že­me si spo­koj­ne sad­núť k šted­ro­ve­čer­né­mu sto­lu, le­bo zá­lo­hy sa vy­ko­na­jú aj bez na­šej prí­tom­nos­ti.

Mu­sí­me si však uve­do­miť nie­koľ­ko sku­toč­nos­tí:
- cron je pe­rio­dic­ký prog­ram, tak­že ne­be­rie do úva­hy rok. Všim­ni­me si, že v de­fi­ní­ciách ča­su nie je rok uve­de­ný. To zna­me­ná, že sa všet­ko vy­ko­ná s roč­nou pe­rió­dou.
- Všet­ky ča­so­vé pod­mien­ky mu­sia byť sú­čas­ne spl­ne­né! To zna­me­ná, že sa prog­ram za­lo­ha sí­ce v tom­to ro­ku nao­zaj vy­ko­ná, le­bo 24. de­cem­bra pri­pad­ne na pia­tok, ale keď­že nas­le­du­jú­ci rok 24. de­cem­bra (2005) pri­pad­ne na so­bo­tu, prí­kaz za­lo­ha sa ne­vy­ko­ná, le­bo nie je spl­ne­ná pod­mien­ka dňa v týž­dni! (To bu­de spl­ne­né až v ro­ku 2010, keď 24. de­cem­ber za­se pri­pad­ne na pia­tok – ak ne­ve­rí­te, poz­ri­te sa do ka­len­dá­ra.)

Pr­vých päť ča­so­vých po­lo­žiek mô­že ok­rem čí­sel­né­ho úda­ja ob­sa­ho­vať nie­koľ­ko zvláš­tnych zna­kov – mo­di­fi­ká­to­rov, kto­ré si pos­tup­ne vy­svet­lí­me.

Mo­di­fi­ká­tor *
Naj­dô­le­ži­tej­ším mo­di­fi­ká­to­rom je znak * (hviez­dič­ka), kto­rý sym­bo­li­zu­je akú­koľ­vek hod­no­tu. Pod slo­vom „akú­koľ­vek“ mô­že­me v tom­to prí­pa­de ro­zu­mieť „kaž­dú“ hod­no­tu. Ako by sme te­da up­ra­vi­li spo­mí­na­ný prík­lad tak, aby sa vy­ko­nal kaž­do­roč­ne? Sta­čí, ak kri­tic­kú po­lož­ku deň v týž­dni nah­ra­dí­me hviez­dič­kou:

25 17 24 12 * root /usr/bin/za­lo­ha

To zna­me­ná, že nech 24. de­cem­ber ľu­bo­voľ­né­ho ro­ku pri­pad­ne na aký­koľ­vek deň v týž­dni, prí­kaz /usr/bin/za­lo­ha sa v da­ný čas vy­ko­ná! Mož­no si po­vie­me, že vy­ko­ná­vať zá­lo­hy raz roč­ne je pri­naj­men­šom tres­tu­hod­né, a tak to bu­de­me chcieť vy­ko­ná­vať raz me­sač­ne, a to vždy 24. deň v me­sia­ci. Nič jed­no­duch­šie! Po­lož­ku me­siac ta­kis­to nah­ra­dí­me hviez­dič­kou:

25 17 24 * * root /usr/bin/za­lo­ha
Ale ro­biť zá­lo­hy raz za me­siac tiež nie je to pra­vé ore­cho­vé... Pre­to od­po­rú­ča­me vy­ko­ná­va­nie raz do týž­dňa, nap­rík­lad v stre­du. Po­tom up­ra­ví­me zá­pis tak­to:
25 17 * * 3 root /usr/bin/za­lo­ha
Vy­me­ni­li sme po­lož­ku deň v me­sia­ci za hviez­dič­ku, le­bo stre­da v týž­dni mô­že pri­pad­núť na ľu­bo­voľ­ný dá­tum. A na­mies­to dňa v týž­dni sme vlo­ži­li troj­ku, kto­rá pred­sta­vu­je stre­du. No ale čo ak má­me cit­li­vé dá­ta a tie chce­me ar­chi­vo­vať kaž­dý deň o 17.25 ho­di­ne? Po­tom bu­de zá­pis vy­ze­rať tak­to:
25 17 * * * root /usr/bin/za­lo­ha
Po­lož­ky deň v me­sia­ci, me­siac a deň v týž­dni nah­ra­dí­me hviez­dič­kou, zos­ta­ne iba mi­nú­ta a ho­di­na.

Os­tat­né mo­di­fi­ká­to­ry
Mô­že sa stať (a aj sa veľ­mi čas­to stá­va), že v na­šom sys­té­me pot­re­bu­je­me ur­či­té úlo­hy pl­niť čas­tej­šie ako raz za deň. Ta­kým extré­mom mô­že byť pra­vi­del­né sťa­ho­va­nie poš­ty kaž­dú mi­nú­tu. Nech sa skript na sťa­ho­va­nie poš­ty na­zý­va /usr/bin/pos­ta, po­tom zá­pis bu­de ta­ký­to:

* * * * * root /usr/bin/pos­ta
Pre­lo­že­né do na­šej re­či: kaž­dú mi­nú­tu kaž­dej ho­di­ny kaž­dé­ho dňa kaž­dé­ho me­sia­ca v kaž­dý deň v týž­dni sa vy­ko­ná sta­no­ve­ný prí­kaz. Ak sme však pri­po­je­ní do inter­ne­tu po­mo­cou mo­de­mu, po­tom je eko­no­mic­kej­šie sťa­ho­vať poš­tu len kaž­dé dve ho­di­ny. Zá­pis pre tú­to čin­nosť bu­de
* */2 * * * root /usr/bin/pos­ta
Mo­di­fi­ká­tor / (lom­ka) udá­va krok a zna­čí „kaž­dý (ča­so­vý úsek)“, te­da zá­pis */2 v po­lož­ke ho­di­na zna­me­ná kaž­dé dve ho­di­ny. Mož­no nám bu­de sta­čiť, aby sa poš­ta sťa­ho­va­la iba cez deň, v no­ci to nie je pot­reb­né. Vte­dy up­ra­ví­me zá­pis tak­to:
* 6-18/2 * * * root /usr/bin/pos­ta
Zá­pis ho­vo­rí, že úlo­ha sa spus­tí kaž­dé dve ho­di­ny v ča­se od 6. ho­di­ny ran­nej do 18. ho­di­ny ve­čer­nej. Mo­di­fi­ká­tor – zna­čí od – do. Pred­sa by len bo­lo dob­re, ke­by sme stiah­li poš­tu aj v no­ci, nap­rík­lad o 22. ho­di­ne pre noč­né­ho vrát­ni­ka. Zá­pis up­ra­ví­me tak­to:
* 6-18/2,22 * * * root /usr/bin/pos­ta

Po­lož­ka ho­di­na v tva­re 6-18/2,22 zna­me­ná kaž­dé dve ho­di­ny v ča­se od 6. ho­di­ny ran­nej do 18. ho­di­ny ve­čer­nej a eš­te aj o 22. ho­di­ne. Mo­di­fi­ká­tor , zlu­ču­je viac hod­nôt.

Po­zor!
Pri tom­to zá­pi­se nes­mie­me pou­žiť me­dze­ru! Tá slú­ži ako od­de­ľo­vač jed­not­li­vých po­lo­žiek!

Vy­tvá­ra­nie cron ta­bu­liek
Už sme uvied­li, že kaž­dý pou­ží­va­teľ si mô­že pre cron vy­tvo­riť svo­ju vlas­tnú ta­buľ­ku. Tá je ulo­že­ná na špe­ci­fic­kom mies­te, nap­rík­lad /var/spool/cron/mior. Aby ju ne­bo­lo pot­reb­né vy­tvo­riť a po­tom ulo­žiť na prís­luš­né mies­to ruč­ne, mô­že­me pou­žiť prog­ram cron­tab.

Po­zor!
Nez­mýľ­me si prog­ram cron­tab so sú­bo­rom cron­tab, to nie je to is­té!

V Li­nuxe je bež­né (ho­vo­rím bež­né, nie nor­mál­ne!), že sa prog­ra­my aj sú­bo­ry na­zý­va­jú rov­na­ko.

Prog­ram cron­tab slú­ži na sprá­vu cron ta­bu­liek. Má tie­to pa­ra­met­re:
-e - edi­to­va­nie sú­bo­ru
-l - vý­pis sú­bo­ru
-r - zma­za­nie sú­bo­ru

Prog­ram cron­tab vo­lá exter­ný edi­tor textu, kto­rý je v sys­té­me za­de­fi­no­va­ný v pre­men­nej EDI­TOR. Spra­vid­la to bý­va prog­ram vi ale­bo je­ho ob­do­ba vim. Pred­stav­me si, že sme pou­ží­va­teľ mior a chce­me vy­tvo­riť svo­ju cron ta­buľ­ku, aby sme na­de­fi­no­va­li sťa­ho­va­nie poš­ty spo­mí­na­né­ho prík­la­du.

Na prí­ka­zo­vom riad­ku za­dá­me:

 [mior@do­ma mior] $ cron­tab –e

(Všim­ni­me si roz­diel v zna­ku prom­ptu. Znak # sym­bo­li­zu­je kon­zo­lu roo­ta, znak $ pred­sta­vu­je kon­zo­lu os­tat­ných pou­ží­va­te­ľov Li­nuxu.)

Po za­da­ní uve­de­né­ho prí­ka­zu sa spus­tí edi­tor vi. Čo­že?! Vy ne­vie­te pou­ží­vať edi­tor vi? Ale to je chy­ba...

Mik­ro­kurz edi­to­ra vi
Edi­tor vi je naj­pou­ží­va­nej­ší edi­tor v unixových sys­té­moch a v Li­nuxe. Nie­ke­dy sa tra­do­va­lo, že kto ne­vie vi (slan­go­vo po­me­no­va­né víč­ko), ten si nes­mie za Unix (Li­nux) ani sad­núť. Dnes to už nie je prav­da... V pos­led­nom ča­se sa pou­ží­va mo­der­nej­ší va­riant s náz­vom vim. Spúš­ťa sa však rov­na­ko ako je­ho his­to­ric­ký pred­chod­ca, jed­no­du­cho prí­ka­zom vi. Zob­ra­zí sa ok­no edi­to­ra, ako je na ob­ráz­ku č. 1:

obr2.jpg
Obr. 1

Ten­to edi­tor ne­má žiad­ne me­nu, žiad­ne mak­rá ani ni­ja­ké iné vy­mo­že­nos­ti kla­sic­ké­ho edi­to­ra. Ov­lá­da sa po­mo­cou klá­ve­sov. Ak chce­me po spus­te­ní edi­to­ra vi za­čať pí­sať, mu­sí­me stla­čiť klá­ves IN­SERT. Na­chá­dza sa nad kur­zo­ro­vý­mi šíp­ka­mi. Už ná­zov in­sert (angl. vlož) zna­čí vkla­da­nie, v na­šom prí­pa­de textu. Ob­ja­ví sa kur­zor a my na­pí­še­me žia­da­ný text. Po ukon­če­ní vkla­da­nia textu stla­čí­me klá­ves Esc. Tým opus­tí­me edi­tač­ný re­žim a prej­de­me do prí­ka­zo­vé­ho re­ži­mu. Za­dá­me : (dvoj­bod­ku), kto­rá sa ob­ja­ví v ľa­vom dol­nom ro­hu ok­na. Za dvoj­bod­ku mô­že­me za­dať tie­to prí­ka­zy:

qa! – na opus­te­nie edi­to­ra bez ulo­že­nia textu a zmien
wq – ulo­že­nie na­pí­sa­né­ho textu
help – na vý­pis hel­pu o edi­to­re vi
Ak chce­me v edi­to­re vi edi­to­vať kon­krét­ny sú­bor, za­dá­me prí­kaz vi me­no_sú­bo­ru.

Eš­te jed­no­duch­šie!
Mož­no je odo mňa kru­té chcieť od vás ov­lá­da­nie edi­to­ra vi, keď dnes exis­tu­jú aj jed­no­duch­šie edi­to­ry. Ja nap­rík­lad veľ­mi čas­to pou­ží­vam edi­tor, kto­rý je sú­čas­ťou Mid­night Com­man­de­ra. Ten sa spus­tí po stla­če­ní klá­ve­su F4 v pros­tre­dí mc. Vo­lá sa mce­dit. (Ak to nie­ko­mu pri­po­mí­na edi­tor nce­dit, kto­rý je sú­čas­ťou Nor­ton Com­man­de­ra, tak má prav­du – nos­tal­gia sa ne­za­prie.) Poz­nám ho dob­re, a pre­to by som ho chcel pou­ží­vať vša­de v Li­nuxe, kde sa vo­lá exter­ný edi­tor. (Ak vy má­te ob­ľú­be­ný iný edi­tor, nič to, uve­de­ný pos­tup pla­tí všeo­bec­ne). Ako však do­nú­tiť prog­ram cron­tab, aby pou­ží­val edi­tor mce­dit? Už sme spo­me­nu­li, že typ edi­to­ra je na­de­fi­no­va­ný v pre­men­nej sys­té­mu s náz­vom EDI­TOR. Naj­prv sa pres­ved­čí­me, aký edi­tor je na­de­fi­no­va­ný. V prí­ka­zo­vom riad­ku za­dá­me prí­kaz

 [mior@do­ma mior] $ echo $EDI­TOR
Prí­kaz echo vy­pí­še ob­sah pre­men­nej EDI­TOR. Ak je tá­to pre­men­ná práz­dna, je štan­dar­dne na­vo­le­ný edi­tor vi, inak sa vy­pí­še me­no edi­to­ra.

Te­raz pre­ty­pu­je­me pre­men­nú EDI­TOR na hod­no­tu mce­dit:

 [mior@do­ma mior] $ export EDI­TOR=mce­dit
To, že sa tak nao­zaj sta­lo, si mô­že­me ove­riť už spo­mí­na­ným prí­ka­zom echo. Od­te­raz, keď spus­tí­me prog­ram cron­tab, na je­ho edi­tá­ciu sa spus­tí edi­tor mce­dit. No a v tom sa pra­cu­je pod­stat­ne prí­jem­nej­šie.

Poz­nám­ka:
Pre­ty­po­va­nie pre­men­nej z prí­ka­zo­vé­ho riad­ka je iba do­čas­né – do vy­pnu­tia sys­té­mu. Ak chce­me, aby sa pre­men­ná pre­ty­po­va­la pri kaž­dom štar­te sys­té­mu, mu­sí­me ulo­žiť da­ný prí­kaz do štar­to­va­cích sú­bo­rov. My už vie­me, kde a ako!

Vráť­me sa však k vy­tvo­re­niu cron ta­buľ­ky pou­ží­va­te­ľa mior. Po za­da­ní prí­ka­zu cron­tab –e sa spus­tí náš ob­ľú­be­ný edi­tor, kto­rý vy­tvo­rí sú­bor mior. Te­raz mô­že­me do sú­bo­ru vkla­dať prí­ka­zy pre cron. V pou­ží­va­teľ­ských ta­buľ­kách net­re­ba za­dá­vať pr­vú časť sú­bo­ru, ako je PATH, MAIL­TO a HO­ME, prej­de­me rov­no na ča­so­vé úda­je:

* 6-18/2,22 * * * root /usr/bin/pos­ta

Ukon­čí­me edi­tá­ciu a sú­bor ulo­ží­me. Tak­to sme vy­tvo­ri­li na­šu cron ta­buľ­ku. Nes­mie­me za­bud­núť, že k sú­bo­ru pos­ta mu­sí­me mať prís­tu­po­vé prá­va, te­da prá­va pou­ží­va­te­ľa mior, inak cron zis­tí, že má čo­si vy­ko­nať, ale to ne­vy­ko­ná, le­bo ne­má prís­luš­né prá­va. To­to je veľ­mi čas­tá chy­ba za­čia­toč­ní­kov (ale aj gu­ru...). Ak chce­me len vy­pí­sať ob­sah cron ta­buľ­ky da­né­ho pou­ží­va­te­ľa, za­dá­me prí­kaz cron­tab –l. V prí­pa­de, že chce­me exis­tu­jú­ci sú­bor zma­zať, za­dá­me prí­kaz cron­tab –r.

Sys­té­mo­vé cron ad­re­sá­re
Všim­ni­me si eš­te raz ob­sah sú­bo­ru /etc/cron­tab na vý­pi­se č. 1 a poz­ri­me sa bliž­šie nap­rík­lad na 1. ča­so­vý ria­dok:

01 * * * * root run-parts /etc/cron.hour­ly

Po­vedz­me si po­zor­ne, čo ten­to zá­pis zna­me­ná. V pr­vú mi­nú­tu kaž­dej ho­di­ny kaž­dé­ho dňa sa pod prá­va­mi roo­ta spus­tí prí­kaz run-parts s pa­ra­met­rom /etc/cron.hour­ly. Čo to zna­me­ná? Cron má ok­rem sú­bo­ru /etc/cron­tab a pou­ží­va­teľ­ských cron ta­bu­liek eš­te aj špe­ciál­ne 4 po­dad­re­sá­re v ad­re­sá­ri /etc/: cron.hour­ly, cron.dai­ly, cron.week­ly a cron.month­ly. Sú to špe­ciál­ne ad­re­sá­re, do kto­rých v da­ný čas, ur­če­ný v sú­bo­re /etc/cron­tab, na­zrie prog­ram run-parts, a ak náj­de v da­nom ad­re­sá­ri ne­ja­ký sú­bor (skript), vy­ko­ná ho.

Poz­ri­me sa pre ilus­trá­ciu na ad­re­sár /etc/cron.dai­ly. Me­dziiným ob­sa­hu­je aj sú­bor log­ro­ta­te. Je­ho ob­sah je na vý­pi­se č. 3:

#!/bin/sh

/usr/sbin/log­ro­ta­te /etc/log­ro­ta­te.conf

Vi­dí­me, že ide o spus­ti­teľ­ný skript, kto­ré­ho úlo­hou je nás­led­ne spus­tiť prí­kaz /usr/sbin/log­ro­ta­te s pa­ra­met­rom /etc/log­ro­ta­te.conf. Všim­ni­me si, že vo všet­kých šty­roch po­dad­re­sá­roch sa na­chá­dza­jú skrip­ty, kto­ré ma­jú do či­ne­nia so sys­té­mom. A všim­ni­me si, že ča­so­vé úda­je pri jed­not­li­vých od­ka­zoch na prís­luš­né po­dad­re­sá­re nao­zaj zod­po­ve­da­jú vhod­ným náz­vom ad­re­sá­rov – kaž­dú ho­di­nu, den­ne, týž­den­ne a me­sač­ne. To však nez­na­me­ná, že ich ne­mô­že­me pou­žiť na na­še úče­ly. Sta­čí, ak do prís­luš­né­ho ad­re­sá­ra vlo­ží­me skript s vo­la­ním žia­da­nej úlo­hy.

Ob­me­dzo­va­nie tvor­by cron ta­bu­liek
Cron má v se­be za­bu­do­va­nú fun­kciu, že mô­že po­mo­cou špe­ciál­nych sú­bo­rov roz­hod­núť, kto mô­že a kto ne­mô­že vy­tvá­rať cron ta­buľ­ky. Tie špe­ciál­ne sú­bo­ry sú /etc/cron.de­ny a /etc/cron.allow. Pl­nia tú is­tú úlo­hu ako sú­bo­ry allow-de­ny iných dé­mo­nov, nap­rík­lad hosts. Prin­cíp čin­nos­ti je ten­to: Ak chce­me nie­ko­mu za­ká­zať pou­ží­va­nie cro­nu, je­ho me­no za­pí­še­me do sú­bo­ru /etc/cron.de­ny. Os­tat­ní neu­ve­de­ní pou­ží­va­te­lia sys­té­mu bu­dú mať po­vo­le­nie cron pou­ží­vať! A nao­pak: Ak chce­me nie­ko­mu po­vo­liť pou­ží­va­nie cro­nu, uve­die­me je­ho lo­go­va­cie me­no do sú­bo­ru /etc/cron.allow. Os­tat­ní neu­ve­de­ní pou­ží­va­te­lia sys­té­mu ne­bu­dú mať po­vo­le­nie cron pou­ží­vať! Pou­ži­je­me iba ten sú­bor, kto­rý je pre nás jed­no­duch­ší, te­da ten, kde sa me­nej pí­še. Ne­pou­ží­vaj­me obid­va sú­bo­ry na­raz – ne­má to zmy­sel! Ak tie­to sú­bo­ry vô­bec neexis­tu­jú, neup­lat­ňu­je sa ni­ja­ké ob­me­dzenie.

Vý­stup z dé­mo­nu cron
My mô­že­me vy­užiť cron aj na od­osie­la­nie mai­lo­vých správ. V prin­cí­pe vy­uži­je­me schop­nosť cro­nu pos­lať svoj vý­stup do iné­ho prog­ra­mu, štan­dar­dne do mai­lo­vé­ho prog­ra­mu. Zá­pis vo všeo­bec­nos­ti bu­de vy­ze­rať tak­to:

prí­kaz_pre_cron|mail mej­lo­vá_ad­re­sa
Ta­kis­to mô­že­me vý­stup pres­me­ro­vať do sú­bo­ru, napr. cron.log tak­to:
prí­kaz_pre_cron>>/var/log/cron.log
Vez­mi­me si ten­to ilus­trač­ný prík­lad. Nech má­me ta­kú­to cron ta­buľ­ku:
15 7 3 5 * echo Ma­ma ma na­ro­de­ni­ny|mail mior@do­ma.sk
20 7 13 2 * echo Man­zel­ka ma na­ro­de­ni­ny |mail mior@mo­bil.sk
25 17 * * * /usr/bin/za­lo­ha>>/var/log/za­lo­ha.log
20 21 * * * /usr/bin/kon­tro­la>>/dev/null

Pre­čí­taj­me si, čo tá­to ta­buľ­ka zna­me­ná:
Pr­vý ria­dok ho­vo­rí:
Kaž­dý rok 3. má­ja o 7.15 ho­di­ne mi na ad­re­su mior@do­ma.sk prí­de mail, kto­rý bu­de ob­sa­ho­vať ve­tu „Ma­ma ma na­ro­de­ni­ny“. Ja si ten­to mail pre­čí­tam a ma­me za­vo­lám. A keď­že mo­ja dob­rá ma­ma bý­va ďa­le­ko a je už na dô­chod­ku, je jed­no, ke­dy si mail pre­čí­tam, či hneď rá­no ale­bo poo­be­de.
Dru­hý ria­dok ho­vo­rí:
Kaž­dý rok 13. feb­ruára o 7.20 ho­di­ne cron od­oš­le na ad­re­su mior@mo­bil.sk mail, kto­rý bu­de ob­sa­ho­vať text „Man­zel­ka ma na­ro­de­ni­ny“. Ten­to mail je však schrán­ka u ope­rá­to­ra mo­bil­ných te­le­fó­nov a je to ta­ká služ­ba, že len čo prí­de sprá­va na tú­to ad­re­su, ob­sah sprá­vy mi da­ný ope­rá­tor pre­poš­le ako SMS sprá­vu na môj mo­bil­ný te­le­fón. Nie som zá­vis­lý od to­ho, ke­dy si mail pre­čí­tam, le­bo mo­bil má­vam (spra­vid­la) so se­bou a po pri­ja­tí SMS sprá­vy okam­ži­te ku­pu­jem ob­rov­skú ky­ti­cu ru­ží a di­aman­to­vý náhr­del­ník a od­chá­dzam za svo­jou mi­lo­va­nou po­lo­vič­kou.
Tre­tí ria­dok:
Ten­to ria­dok už poz­ná­me. Kaž­dý deň o 17.25 ho­di­ne sa vy­ko­ná skript s náz­vom zá­lo­ha a je­ho vý­stup­né hlá­se­nia sa ulo­žia do sú­bo­ru /var/log/za­lo­ha.log. Tam si ich náj­dem a vo vhod­nú chví­ľu preš­tu­du­jem, či všet­ko pre­beh­lo v po­riad­ku.
Štvr­tý ria­dok:
Kaž­dý deň o 21.20 ho­di­ne sa spus­tí skript /usr/bin/kon­tro­la a je­ho texto­vé vý­stu­py sa poš­lú na za­ria­de­nie /dev/null. To­to je špe­ciál­ne za­ria­de­nie v Li­nuxe a mô­že­me si pod ním pred­sta­viť bez­od­ný od­pad­ko­vý kôš. Všet­ko, čo poš­le­me na to­to za­ria­de­nie, sa nav­ždy za­ho­dí (a ne­mož­no to ob­no­viť!).

Prog­ram at
Prog­ram at je pod­stat­ne jed­no­duch­ší ako prí­kaz cron. Ne­má ani kon­fi­gu­rač­né sú­bo­ry ani ni­ja­ké ta­buľ­ky, všet­ko sa za­dá­va z prí­ka­zo­vé­ho riad­ka. Je­ho úlo­hou je spus­tiť kon­krét­nu čin­nosť v za­da­nom ča­se. Keď sa da­ná úlo­ha spl­ní, prí­kaz at sa ukon­čí. Všeo­bec­né za­da­nie prí­ka­zu at je ta­ké­to:

at ča­so­vý_údaj 

Hod­no­ty pre prog­ram at
Ča­so­vý údaj je pa­ra­met­rom prog­ra­mu at a mô­že do­sa­ho­vať tie­to hod­no­ty:
špe­ci­fi­ká­cia ča­su vo for­me HH:MM
špe­ci­fi­ká­cia dá­tu­mu vo for­me
MMDDRR
MM/DD/RR
DD.MM.RR
ča­so­vá jed­not­ka v tva­re at čas + ča­so­vá_jed­not­ka vo for­me
mi­nu­tes
hours
days
weeks
to­morrow
to­day
pres­ný čas vo for­me
noon
mid­night
tea­ti­me (t. j. o 16.00 hod.)
now

nap­rík­lad at 15:00 + 5 days zna­čí, že sa da­ná úlo­ha vy­ko­ná o 5 dní o tre­tej poo­be­de.

Ak pri­dá­va­me aj dá­tum, dá­va­me ho zá­sad­ne za ča­so­vý údaj, napr. at 17:30 122404, čo bu­de na Šted­rý deň o pol šies­tej ve­čer.

Ale kde za­dá­me prí­kaz, kto­rý chce­me vy­ko­nať?
Po za­da­ní prí­ka­zu at s da­ným ča­som sa na ob­ra­zov­ke ob­ja­ví no­vý prompt so zna­kom zo­bá­či­ka >. Na ria­dok s tým­to prom­ptom za­dá­va­me prí­ka­zy, kto­ré sa ma­jú vy­ko­nať v da­nom ča­se. Po za­da­ní pos­led­né­ho prí­ka­zu a potvr­de­ní klá­ve­som En­ter stla­čí­me kom­bi­ná­ciu klá­ve­sov Ctrl – D. Tým sa uzat­vo­rí edi­to­va­nie prog­ra­mu at a žia­da­né prí­ka­zy sa ako úlo­ha ulo­žia do fron­tu a ča­ka­jú na ten správ­ny čas, keď sa vy­ko­na­jú.

Ov­lá­da­nie fron­tu at
Na ov­lá­da­nie fron­tu úloh, kto­ré ča­ka­jú na spus­te­nie, exis­tu­jú tie­to prí­ka­zy:
atq
at –c
atrm

Prí­kaz atq vy­pí­še exis­tu­jú­ce úlo­hy, ča­ka­jú­ce vo fron­te na vy­ko­na­nie. Za­dá­me prí­kaz
 [root@do­ma root] # atq
a na ob­ra­zov­ke sa zob­ra­zí napr.:
1          2004-11-10   14:51  a   root    

 

Vy­pí­še sa iden­ti­fi­kač­né čís­lo úlo­hy, dá­tum a čas vy­ko­na­nia, typ úlo­hy a vlas­tní­ka úlo­hy. Ty­py úlo­hy sú:
a je štan­dard­ný typ
b je pre úlo­hu pa­tria­cu prí­ka­zu batch (ne­bu­de­me te­raz pre­be­rať)

Ak chce­me vi­dieť ob­sah úlo­hy, kto­rá sa v ur­či­tý čas vy­ko­ná, pou­ži­je­me prí­kaz
 at -c iden­ti­fi­kač­né_čís­lo_úlo­hy, 
nap­rík­lad
 [root@do­ma root] # at –c 1
a na ob­ra­zov­ke sa ob­ja­ví vý­pis prí­ka­zov, tak ako sme ho pre da­nú úlo­hu za­da­li.

Prí­kaz atrm od­strá­ni da­nú úlo­hu z fron­tu. Syn­tax prí­ka­zu je atrm iden­ti­fi­kač­né_čís­lo_úlo­hy.

Tak ako cron aj prog­ram at mô­že dis­po­no­vať sú­bor­mi at.allow ale­bo at.de­ny v ad­reári /etc/. Ak má mať uží­va­teľ mož­nosť pou­ží­vať prog­ram at, mu­sí byť uve­de­ný v sú­bo­re /etc/at.allow, resp. nes­mie sa na­chá­dzať v sú­bo­re /etc/at.de­ny. Po­kiaľ neexis­tu­je ani je­den z tých­to sú­bo­rov, nik­to ok­rem roo­ta ne­má mož­nosť dis­po­no­vať prog­ra­mom at. Ak exis­tu­je len /etc/at.de­ny a je prázd­ny, po­tom mô­že s at pra­co­vať kaž­dý.

Vi­zuál­ne nás­tro­je
Aby sme po­te­ši­li aj des­kto­pis­tov, kto­rí ne­ma­jú prí­ka­zo­vý ria­dok veľ­mi v lás­ke, exis­tu­je dos­ta­toč­né množ­stvo vi­zuál­nych nás­tro­jov na sprá­vu prog­ra­mov cron a at v gra­fic­kom pros­tre­dí. Je­den z nich je aj prog­ram vcron Fran­cú­za Da­nie­la Ro­ché­ho, kto­rý zís­ka­me na strán­ke http://www.li­nux-kheops.com/pub/vcron/vcronGB.html. Screen­shot nad­stav­by vcron je na ob­ráz­ku č. 4.

obr4.jpg
obr. 4

Zá­ver
Tou­to spo­loč­nou čas­ťou pre server­ist­ov aj des­kto­pis­tov sa s des­kto­pis­ta­mi čias­toč­ne lú­čim. V sek­cii des­ktop sme preb­ra­li (sko­ro) všet­ko, čo by mal des­ktop­ista v pod­sta­te ve­dieť. Ho­vo­rím čias­toč­ne, le­bo keď sa v des­kto­pe ob­ja­ví nie­čo no­vé (a to sa is­to ob­ja­ví...), po­vie­me si o tom pár slov. A v prí­pa­de, že by ma­li des­kto­pis­ti po­cit, že sme sa eš­te ne­nau­či­li to či ono, mô­žu mi pos­lať mail na mior@psg.sk a za­se sa v sek­cii des­kto­pu s kon­krét­nou té­mou stret­ne­me.

Des­kto­pis­ti však ne­mu­sia byť smut­ní, že ich opúš­ťa­me. Niek­de v tých­to mies­tach sa za­čí­na no­vý se­riál o OpenGL pod Li­nuxom (čo je o gra­fi­ke) od môj­ho ko­le­gu Ma­re­ka Sop­ka. A my server­ist­i sa na­ďa­lej bu­de­me ve­no­vať server­om, tu nás ča­ká eš­te po­riad­ny kus prá­ce. Ok­rem iné­ho (aj server­ist­i, aj des­kto­pis­ti) sa pus­tí­me do no­vé­ho, už avi­zo­va­né­ho a mno­hý­mi oča­ká­va­né­ho se­riá­lu Li­nux extra, kde bu­de­me k Li­nuxu pri­pá­jať rôz­ne za­ria­de­nia. Za­čne­me jed­no­du­chý­mi sve­tel­ný­mi di­óda­mi, tla­čid­la­mi, prej­de­me na rôz­ne re­léo­vé spí­na­če a bu­de­me sa za­obe­rať aj via­criad­ko­vý­mi LCD dis­plej­mi. Čo to po­ču­jem? Že to nie je vô­bec pre des­kto­pis­tov? Om­yl, pá­ni... Eš­te som ne­vi­del des­kto­pis­tu, kto­rý by nech­cel mať k svoj­mu po­čí­ta­ču pri­po­je­ný mo­bil!

Ďal­šie čas­ti >>

Zdroj: Infoware 12/2004



Ohodnoťte článok:
 
 
 

24 hodín

týždeň

mesiac

Najnovšie články

Li­nux prak­tic­ky ako server úvod
Linux ako server je pomerne zložitá technológia. Jej výhodou je určitá modularita, keď sa nemusí nastaviť celý server naraz, ale postupne. čítať »
 
Syn­chro­ni­zá­cia ča­su v Li­nuxe
V predchádzajúcich dvoch častiach sme si ukázali, že Linux a všeobecne open source softvér sa nenachádza iba v serveroch a počítačových sieťach, ale aj v iných zariadeniach bežnej domácej potreby a v oblasti hobby. čítať »
 
Za­ria­de­nia za­lo­že­né na Li­nuxe
V predchádzajúcej časti sme si spomenuli definície nie - ktorých pojmov z oblasti nášho záujmu, teda Linuxu. Vysvetlili sme si, čo je to Open Source, Public Domain, proprietárny softvér a GNU GPL. Tentoraz ukážeme, ako sa tieto pojmy využívajú v praxi. čítať »
 
Po­jmy z ob­las­ti
Tentoraz na chvíľu trochu odbočíme od bezpečnosti Linuxu a jeho siete. V tejto neštandardnej časti seriálu sa mu budeme venovať len okrajovo. čítať »
 
Bez­peč­nosť bez­drô­to­vých sie­tí II.
V predchádzajúcej časti sme sa začali zaoberať bezpečnosťou bezdrôtových sietí. Poukázali sme na rôzne faktory zneužitia siete, podstatu rizika a vysvetlili sme základné prvky bezpečnosti. čítať »
 
Bez­peč­nosť bez­drô­to­vých sie­tí I.
V predchádzajúcich častiach sme sa venovali bezpečnosti linuxového servera. Riešili sme firewall, bezpečnosť prístupu na internet, zaoberali sme sa demilitarizovanou zónou a podobne. čítať »
 
Údr­žba lo­gov – kon­fi­gu­rá­cia log­ro­ta­te
V predchádzajúcej časti sme sa venovali rotácii logov. Vysvetlili sme princíp ukladania logov, spôsob, ako sa rotujú, a uviedli sme niečo o tom, čo a ako treba nastaviť čítať »
 
Údr­žba lo­gov – ro­tá­cia
V predošlej časti sme sa zaoberali spôsobom logovania informácií na iný alebo vzdialený počítač a ukázali sme, ako riešiť problém s logovaním uzavretých procesov pomocou chroot. čítať »
 
 
 
  Zdieľaj cez Facebook Zdieľaj cez Google+ Zdieľaj cez Twitter Zdieľaj cez LinkedIn Správy z RSS Správy na smartfóne Správy cez newsletter