Linux E X P R E S

Facebook

Cron – správca úloh

Ak používate Linux (Unix) a náhodou ste narazili na tajomné slovo „cron“, možno sa poškrabete po hlave a spýtate sa – čo to je? Cron je názov programu, ktorý užívateľom Linuxu a tým pádom aj Unixu (čo už nebudem ďalej zdôrazňovať) poskytne možnosť spúšťať skripty alebo iba príkazy či skupinu príkazov automaticky a pravidelne v stanovenom čase.


Cron – mocný, ba až kráľovský nástroj pre administráciu systému, poslúži vhodne rôznymi spôsobmi napr. aj ako možnosť zálohovania, keď v určitom čase, povedzme vždy o 17:00 každý deň alebo o 19:00 každú nedeľu, sa spustí program (skript), ktorý zálohuje systém, konfiguračné súbory alebo www stránky. Pravdaže, zálohovať možno hocičo. Cron takisto využijete na hocičo. Ak nesurfujete po internete, ale iba čítate poštu, možno v takom prípade bude jednoduchšie si prácu s e-mailom zautomatizovať pomocou programu cron – pošta sa stiahne vždy v stanovenom čase do vášho počítača. Rovnako pomocou démonu cron si môžete pravidelne zasielať SMS správu na mobilný telefón, treba mať však pevnú linku alebo systém, ktorý bude v čase, keď sa posiela e-mail, vždy aktívny.

Cron sa spustí pri štarte systému a potom ostane prítomný; pravidelne sa „zobúdza“ (každú minútu) a kontroluje svoje „crontabs“ alebo „cron tables“ (cron tabuľky) – súbory, v ktorých sú zadefinované úlohy aj s časom pre ich spustenie. Cron ako démon je súčasťou systému a po inštalácii akéhokoľvek systému typu unix bude prítomný. Ak náhodou neviete, démon je rezidentný program, ktorý beží na pozadí – stačí ho teda spustiť iba raz. Keďže hovoríme o démone, v súvislosti s termínom „cron“ používame aj termín „crond“.

Crond sa na väčšine Linuxoch nainštaluje automaticky. Pravdaže, nemusí to byť vždy pravidlom. Máte povedzme tak trochu neštandardný Linux, alebo sa niekto hral s vašimi konfiguračnými súbormi. V takom prípade je potrebné zistiť, či crond beží, čo docielite nasledovným príkazom:

$ ps aux | grep crond
Mali by ste mali vidieť text podobný:    
root   740  0.0  0.8  1568  684 ?        S    16:49   0:00 crond
root   941  0.0  0.7  1700  584 pts/0    S    17:29   0:00 grep crond

V tomto prípade crond beží. Ak nebeží, najlepšie je ho spustiť spúšťacími skriptami, ktoré systém aktivuje pri svojom štarte. Stačí iba pridať riadok crond do jedného z nich. Red Hat/Fedora Linux má inak súbor crond v adresári /etc/rc.d/init.d . Cron sa teda spustí pri každom štarte systému. Crond sa nachádza v adresári /usr/sbin/ . Ak cron nie je zadefinovaný v niektorom inicializačnom skripte, stačí zadať do príkazového riadku ako užívateľ root príkaz crond .

Rôzne konfiguračné súbory démonov (httpd.conf atď.) vyžadujú, aby bol démon reštartovaný, čo plní účel načítania konfiguračného súboru. Cron však automaticky načíta zmeny v súboroch. Treba však zohľadniť aj skutočnosť, že autorov je viac, preto ani cron nie je jeden. Z tohto dôvodu hovoríme aj „Vixie Cron“ (autorom je Paul Vixie), ktorý má pravidlá iné ako cron od iného autora. Vixie Cron je však štandardný cron, preto, ak používate Linux, na vašom systému bude s najväčšou pravdepodobnosťou Vixie Cron.

Používame cron

Red Hat/Fedora Linux a aj iné distribúcie majú v adresári /etc podadresáre cron.daily (cron každý deň), cron.hourly (cron každú hodinu), cron.weekly (cron každý týždeň), cron.monthly (cron každý mesiac). Red Hat/Fedora sa v tomto trochu líšia od iných Linuxov. Keď nahliadnete do týchto adresárov, uvidíte v nich súbory, ktoré sa týkajú automatického spustenia programov. Ak chcete mať ešte väčšie pole pôsobnosti, môžete editovať súbor /etc/crontab, ktorého syntax na systéme RH/F je:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Prvú časť skriptu hádam netreba vysvetľovať. „Shell“ je Bash, Sh, Csh a PATH je cesta pre cron. Ak napríklad používate program, ktorý sa nachádza v adresári /usr/local/bin, pridajte túto cestu do hornej časti skriptu. MAILTO slúži ako e-mailová schránka pre výstup – ak nejaký program, ktorý cron spustil, má aj výstup (napr. hľadá súbory s povolenými všetkými právami), výstup bude poslaný do tejto e-mailovej schránky. HOME je domovský adresár. Položky v súboroch cron pozostávajú z polí podobne, ako je to v súbore /etc/passwd, ale separátor je medzerník. Máme sedem polí, ktoré predstavujú:

minute minúta, kedy bude aplikácia, príkaz, skupina príkazov spustená; hodnoty sú 0-59
hour hodina, kedy bude aplikácia, príkaz, skupina príkazov spustená; hodnoty sú 0-23, 0 je polnoc
dom deň v mesiaci, kedy bude aplikácia, príkaz, skupina príkazov spustená; hodnoty číselne korešpondujú s mesiacom, napr. 23 je každý mesiac dvadsiateho tretieho
month mesiac, kedy bude aplikácia, príkaz, skupina príkazov spustená; hodnoty sú 0-12
dow deň týždňa, kedy bude aplikácia, príkaz, skupina príkazov spustená; hodnoty sú 0-7, pričom 0 a 7 sú nedeľou
user užívateľ, ktorý spúšťa príkazy
cmd príkaz, ktorý chce užívateľ spustiť

V adresároch /etc, teda /etc/cron.hourly atď. sú globálne systémové hodnoty. Ich aplikovanie sa týka celého systému a užívateľ môže do týchto adresárov doinštalovať rôzne skripty. Napríklad príkaz tmpwatch, pre ktorý je v RH/F zadefinovaná cron úloha v adresári /etc/cron.daily, odstráni súbory, ku ktorým nikto nepristupoval istý počet hodín. Tmpwatch je dobré aplikovať na /tmp adresár. Stačí teda prekopírovať súbor s príkazmi do niektorého z adresárov /etc/cron.daily, /etc/cron.monthly a ten sa bude spúšťať podľa potreby vždy každú hodinu, každý deň, každý týždeň alebo každý mesiac. Ak skript prekopírujete do niektorého z týchto adresárov, môžete naň zabudnúť, pretože jeho vykonávanie už bude automatické. Linux takto uľahčuje užívateľom prácu a trochu času pri stanovení častých úloh.

Cron tabuľky

Cron tabuľky sú určené pre všetkých užívateľov a nemusia byť globálne. Ako globálne sa môžu javiť, ak si ich zadefinuje užívateľ root, ale hociktorý užívateľ môže mať právo editovať, mazať či tvoriť svoje cron tabuľky, teda úlohy. Linux je viacužívateľský operačný systém, a preto aj každý užívateľ môže mať vlastné súbory crontab, ktoré si môže vytvoriť, editovať atď. príkazom crontab. Aj keď ide o textový súbor, nemali by sme ho editovať priamo. Súbor crontab je často uložený v adresári /var/spool/cron/crontabs/užívateľ (na systémoch Unix/Slackware/*BSD), /var/spool/cron/užívateľ (na systémoch Red Hat/Fedora), alebo /var/cron/tabs/užívateľ (na systéme SUSE Linux). Meno užívateľa vychádza z jeho definície v súbore /etc/passwd. Súbor crontab sa samozrejme môže nachádzať aj inde – závisí to od distribúcie, ktorú používate.

Ak chcete editovať súbor crontab, zadajte príkaz crontab -e, ktorým spustíte editor. Ak používate Bash shell a máte nastavený iný, nie editor vi, a chcete použiť editor vi, zadajte do príkazového riadku príkaz export EDITOR=vi . Namiesto vi môžete uviesť akýkoľvek iný editor, v ktorom ste zvyknutí pracovať. Pre súbor crontab platia rovnaké pravidlá ako pre súbor /etc/crontab, avšak s výnimkou, že nemusíte špecifikovať premennú MAILTO. Ak ste zadefinovali požiadavky pre automatické spúšťanie a prácu s editorom ste ukončili, prebehne kontrola syntaxe a vy budete mať možnosť opraviť chyby. Súbor môžete napísať aj v hocijakom editore a potom ho aktivovať príkazom crontab tak, aby ste načítali vami vytvorený súbor, t.j. crontab moj_subor.cron .

Príkazom crontab -l si prezriete súčasne nastavenie a príkazom crontab -r odstránite nastavenie v aktuálne používanom crontab súbore. Ak máte vyššie práva, ostatným užívateľom môžete editovať, mazať súbory crontab príkazom crontab -u meno_užívateľa .

Niekoľko príkladov

Zadáte teda príkaz crontab -e a ak používate editor vi, stlačte klávesu [Ins], aby ste mohli písať. Po editácii stlačte klávesu [Esc] a potom :wq (dvojbodka a „w“ a „q“ bez úvodzoviek). Najprv napíšete definície pre určenie času a potom príkaz. Povedzme napríklad, že máme súbor na zálohovanie ramdisku, v ktorom máme uložené www stránky. Ramdisk sa nachádza v adresári /mnt/ram0, vytvoríme si teda skript backupram a zapíšeme doň tieto riadky:

#!/bin/sh
/bin/tar cvfzp /ram0.tgz /mnt/ram0

Z príkazov vyplýva, že sa spustí program tar, ktorý zálohuje celý adresár /mnt/ram0 a uloží ho do koreňového adresára / pod názvom ram0.tgz. Naším skriptom je teraz backupram, ktorý uložíme povedzme do adresára /root/bin. Preto, keď otvoríme editor s príkazom crontab -e, zapíšeme doň tento riadok:

*/15 * * * * /root/bin/backupram

Skript backupram bude spustený každých 15 minút, * je nešpecifikovaná hodnota. To, čo nás musí zaujímať, je časový údaj, nie príkaz samotný, lebo ten si môžete zmeniť podľa ľubovôle – namiesto /root/bin/backupram môžete uviesť aj iný skript, resp. hocičo. Používanie skriptov je užitočné, ak máte viac príkazov, sériu príkazov atď. Ak uvediete príkaz/skript, je vhodné uviesť jeho absolútnu cestu (/root/bin/backupram, nie iba backupram).

17 8 * * * /root/bin/backupram 

Príkaz bude spustený každý deň o 8:17 ráno.

44 4 1 * * /root/bin/backupram

Príkaz je spustený o 4:44 ráno vždy prvého každý mesiac.

Vixie Cron prijíma aj zoznamy v poliach, ktoré si najlepšie znázorníme na príklade:

45 11 * * 1,2,3,4,5 backup.sh

Príkaz spustí Bash skript backup.sh o 11:45 v pondelok, utorok, stredu, štvrtok a piatok.

Cron prijíma aj „krokové“ hodnoty ako */2 v poli dom bude znamenať, že sa spustí každé dva dni. Podobne hodnota */5 v poli „hodina“ bude znamenať, že sa príkaz spustí každú piatu hodinu. Z tohto vyplýva, že nasledovné príkazy sa budú chovať rovnako:

* 12 10-16/2 * *  backup.sh
* 12 10,12,14,16 * *  backup.sh

Zoznamy možno kombinovať jeden s druhým ako aj s „krokovými“ hodnotami:

* 12 1-15,17,20-25 * * príkaz

V adresári /home/username/domain-www/ máte skript, ktorý chcete spustiť každé ráno a 4:30. Cron úlohu vytvoríte nasledovne:

crontab -e
30 4 * * * /home/username/domain-www/script_name
Esc
:wq  #(ukončenie editora „vi“)

Do konfiguračných súborov crontab môžete umiestniť aj poznámky, ale musí byť pred nimi znak #.

Kto bude mať prístup?

Cron má zabudovanú funkciu pre právo zasiahnuť do jeho útrob, teda kto môže a kto nemôže definovať a meniť nastavenie. V adresári /etc sa nachádza súbor /etc/cron.allow a /etc/cron.deny. Tieto súbory plnia podobný účel ako „allow/deny“ pre iné démony (hosts.allow atď.). Ak sa nenachádzajú v adresári /etc, treba ich vytvoriť. Ak nechcete niektorému užívateľovi (užívateľom) povoliť, aby používal cron, stačí do súboru cron.deny uviesť jeho meno. Podobne – ak chcete povoliť užívateľovi používať cron, do súboru /etc/cron.allow treba uviesť jeho meno. Ak chcete všetkým užívateľom zakázať používanie cronu, do súboru /etc/cron.deny treba uviesť: ALL napr. príkazom echo ALL >>/etc/cron.deny alebo hociktorým editorom.

Ak súbory /etc/cron.allow a /etc/cron.deny neexistujú, potom je používanie časového démonu cron neobmedzené (každý užívateľ ho môže používať).

Výstup z cronu

Výstup z démonu cron je poslaný na e-mailovú adresu jeho vlastníka, resp. adresu špecifikovanú v položke MAILTO, kde môžete uviesť aj inú e-mailovú adresu:

príkaz | mail -s "predmet mailu" užívateľ

Užívateľ nemusí mať účet na danom počítači, preto namiesto „užívateľa“ môžete uviesť aj e-mailovú adresu s účtom užívateľa, ktorému chcete poslať výstup z cronu. Niekedy nemusíte chcieť, aby bol výstup zaslaný e-mailom, preto môžete presmerovať výstup do log súboru alebo do /dev/null: príkaz >> súbor.log . >> znamená, že výstup nevymaže predchádzajúci zápis, ale zapíše sa na jeho koniec (append), > vymaže predchádzajúci zápis (write). Ak si však neviete rady a niektoré otázky stále nie sú jasné, môžete použiť grafické konfigurátory pre crontab, ktorých je niekoľko.

Tipy

Uveďme si príklad – chceme, aby nám cron vypisoval, kedy má kto narodeniny. Otec sa narodil 20.8., mama 2.11., Peter 24.2., Zuzana 8.3., brat 26.9. Otvoríme crontab príkazom crontab -e a zapíšeme doň nasledovné riadky. Výstup bude poslaný na zadanú e-mailovú adresu:

#(Minúta, hodina, deň v mesiaci, mesiac). 
0 8 20 08 * echo Narodeniny má otec | mail tvoj@email
0 8 02 11 * echo Narodeniny má mama | mail tvoj@email
0 8 24 02 * echo Narodeniny má Peter | mail tvoj@email
0 8 08 03 * echo Narodeniny má Zuzana | mail tvoj@email
0 8 26 09 * echo Narodeniny má brat | mail tvoj@email

Beriete tabletku a občas sa stáva, že zabudnete. Dnes služby v sieti mobilných operátorov ponúkajú možnosť poslať e-mail aj ako SMS správu na mobilný telefón. Zapísaním nasledovného riadku

0 20 * * * echo "Nezabudni na liek!" | mail mobil@tuniekde_sk

docielite, že v 0 minút vždy o 20 hodine večer ktorýkoľvek mesiac či deň si pomocou e-mailu pošlete SMS správu na mobilný telefón.

Dobrým tipom môže byť aj pozrieť si manuálové stránky zadaním príkazu man cron, man crontab alebo man 5 crontab.

Diskuze (1) Nahoru