Hlavní navigace

Cron: naplánovanie opakujúcich sa procesov

Peter Gazo 24. 4. 2012

Pri používaní Linuxu ste sa isto stretli so slovo Cron. Čo to je? Je to veľmi silný nástroj pre administráciu systému, ale aj pre zautomatizovanie opakujúcich sa úloh. Nastavíte si pomocou neho, v ktorý deň, hodinu a mesiac sa má spustiť váš ľubovoľný skript. Ako sa pracuje s týmto programom?

Čo je Cron?

V Linuxe sa o opakujúce vykonávanie príkazov stará väčšinou daemon cron. Objavil sa v unixoch v 70. rokoch minulého storočia, ale obsahoval veľa neužitočných funkcií. V distribúciach sa dodáva moderná reimplementácia pomenovaná po jej autorovi Paulovi Vixovi, a to Vixie-cron. Poskytuje funkcie navyše a bez predchádzajúcich chýb.

Cron je automatický naštartovaný po spustení systému a beží celý čas. Cron z konfiguračných súborov číta časy, v ktorých sa majú vykonávať príkazy. Skoro všetko, čo je možné spustiť ručne zo shellu, je možné vykonať aj pomocou daemona cron. V crone okrem /bin/sh, čo je v Linuxe odkaz na bash a teda vylepšená verzia klasického Bourne shelu, ide nastaviť aj tak, aby používal iné shelly.

Crontab jeho funkcia a súbory

Konfiguračný súbor cronu sa nazýva crontab, čo je odvodené od skratky „cron table“. Daemon cron hľadá súbory crontab na troch miestach: /var/spool/cron (v Debiane to je /var/spool/crontabs), /etc/cron.d /etc/crontab.

Súbory crontab pre jednotlivých užívateľov sa ukladajú do priečinka /var/spool/cron. Tu nájdete maximálne jeden súbor crontab pre jedného užívateľa: jeden pre superužívateľa (root), jeden pre užívateľa (peter), další pre ďalšieho užívateľa (danka) atď. Súbory crontab majú pomenovanie podľa prihlasovacích mien užívateľov, ktorým patria, a cron tieto názvy súborov používa k zisteniu UID, ktoré má použiť, keď spúšťa príkazy, ktoré každý tento súbor obsahuje.

Súbory crontab, ktoré plánujú úlohy systémovej údržby a iné úlohy, ktoré definoval správca systému, sú uložené v súbore /etc/crontab a v súboroch nachádzajúcich sa v priečinku /etc/cron.d. Tieto súbory majú trocha iný formát ako súbory crontab pre jednotlivých užívateľov, pretože umožňujú spúšťať príkazy pre ľubovoľných užívateľov. Daemon cron spracováva položky v /etc/crontab  a /etc/cron.d identicky. Všeobecné je /etc/crontab určený pre ručnú úpravu správcom a /etc/cron.d sa poskytuje ako miesto, kam môžu softvérové balíčky inštalovať potrebné položky crontab.

Daemon cron behom štartu načíta všetky svoje konfigurácie, uloží ich do operačnej pamäte a potom zaspí Jeden krát za minútu sa cron zobudí, skontroluje časy modifikácie u súborov crontab a znovu načíta súbory, ktoré sa zmenili, vykoná všetky úlohy naplánované na danú minutú a opäť zaspí.

Žurnálovacie záznamy o svojej činnosti zaznamenáva cron prostredníctovm syslog, pričom ich označuje ako „cron“ a väčšina správ má úroveň „info“

Užívatelia, ktorí môžu zadávať crontaby, sú uvedení v dvoch konfiguračných súboroch: /etc/cron.allow a /etc/cron.deny. Ak tieto súbory neexistujú, smie crontaby posielať len superužívateľ. (V systémoch Ubuntu a Debian sú to implicitne všetci užívatelia.) Ak existuje súbor allow, obsahuje zoznam užívateľov, ktorí môžu zadávať crontaby, a to na každom riadku jedného. Osoby neuvedené v tomto zozname nemôžu príkazy crontab spustiť. Keď súbor allow neexistuje, kontroluje sa súbor deny. To je opäť zoznam užívateľov, ale jeho význam je opačný. Prístup k príkazom crontab majú všetci užívatelia okrem užívateľov uvedených v súbore deny.

Je dôležite si uvedomiť, že riadenie prístupu implementuje crontab, a nie cron. Keď užívateľ dostane nejakým spôsobom crontab do vhodného priečinka, cron slepo vykoná príkazy, ktoré obsahuje.

Linuxové systémy majú často predinštalované položky crontabu, väčšinou v priečinku /etc/cron.d. Okrem mechanizmu /etc/cron.d linuxové distribúcie tiež obsahujú predinštalované položky crontabu, ktoré spúšťajú skripty v známych priečinkoch a tak poskytujú ďalší spôsob, ktorým môžu softvérové baličky inštalovať periodické úlohy bez upravovania súborov crontabu. Napríklad skripty v priečinku /etc/cron.daily sa spúšťajú jeden krát za deň, a skripty v priečinku /etc/cron.weekly sa spúšťajú jeden krát za týždeň. Ďalšie sú /etc/cron.hourly//etc/cron.monthly/.

Formát crontab

minúta hodina deň mesiac deňVtyždni [uživateľ] príkaz

Polia minúta, hodina, deň, mesiac a deňvtýždni definuje, kedy sa má príkaz vykonať
Mesiac – zadajte číslo v intervale 1..12, alebo názov mesiaca
Deň v týždni – zadajte číslo v intervale 0..6 (0 je nedeľa) alebo názov dňa ako je mon, tue atď.)

Každé časové pole môže obsahovať:

  • Celé číslo, ktoré sa zhoduje s presným časom
  • Dve čísla oddelené pomlčkou, ktorá vyhovuje rozsahu hodnôt
  • Hviezdičku, ktorá vyhovujú všetkým časom
  • Čiarkami oddelený zoznam rozsahov alebo čísel, ktorý vyhovuje všetkým vypísaným hodnotám.

Do rozsahu hodnôt je možne zahrnúť aj i hodnotu kroku. Napríklad postupnosť 0,2,4,6,8,10,­12,14,16,18,20 za­píšete ako 0–20/2.

Časový údaj:

40 11 * * 1-4

Znamená spustiť príkaz od pondelka do štvrtku o 11:40. Hviezdička na prvom mieste by spustila príkaz každú minútu.

V záznamoch súboru crontab je možné použivať len príkazy z príkazového interpreta Bourne shell. To znamená, že nemôžete používať žiadne rozšírenie, ktoré ponúka bash alebo iný moderný príkazový interpret. Nedá sa napríklad použiť znak ~ pre špecifikáciu vášho domovského priečinka. Pre špecifikáciu tohto priečinku je však možné použiť systémovú premenu $HOME ( cron pozná aj systémové premenné $USER a $SHELL). Každý príkaz má pri behu ako pracovný priečinok nastavený váš domovský priečinok. Niekedy je lepšie v záznamoch cron lepšie zapísať celú cestu k súborom. Máte potom istotu, že sa príkaz vždy nájde, a netreba sa spoliehať na správne nastavenie systémovej premennej  $PATH.

Ak je príkaz príliš dlhý na to , aby ste ho zapísali do jedného riadku, vytvorte skript a v zázname cron miesto príkazu uveďte tento skript. Skript musí byť spustiteľný ( chmod +x).

 0 1 * * * sh skript

Vytvorenie záznamu

Záznamy, ktoré sú v crontabe, editujeme pomocou

 uzivatel$ crontab -e

Tento príkaz zobrazí pri prvom spustení výber editorov. Po zvolení vhodného sa bude implicitné spúšťať v ňom. V prípade ak ho potrebujete zmeniť, urobíte to nasledovne:

uzivatel$ export VISUAL=joe.

Na začiatok editovaného textu je možné pridať komentáre. Ich riadok začína znakom  #.

 # Záloha priečinka home každý deň o 5:00
0 5 * * * tar -zcf /var/backups/home.tgz /home/

Keď ukončíte prácu s editorom vi, príkazy sa uložia. Záznamy pre crontab si môžete pozrieť pomocou príkazu:

uzivatel$ contab -l

Ako užívateľ root môžete súbory crontab ostatných užívateľov editovať príkazom:

root# crontab -u uživatel -e

Bez argumentov na príkazovom riadku sa príkaz crontab pokúsi prečítať crontab zo štandardného vstupu. Pozor: tento režim neukončujte [ctrl+D], tým by ste si zmazali celý váš crontab. Ukončite ho  [ctrl+c].

Príklady záznamu pre cron

Ak chcete, aby sa príkaz spustil každý deň o druhej hodine v noci, zadajte minúty ako 0 a hodiny ako 2 (teda 2:00). ďalšie 3 položky možu byť vyplnené ako hviezdičky, čo znamená: každý deň a každý mesiac v danú hodinu.

 0 2 * * * tar -zcf /var/backups/home.tgz /home/

Vykonanie príkazu iba každý prvý deň v mesiaci nastavíme pomocou 1 v tretej položky.

 0 2 1 * * tar -zcf /var/backups/home.tgz /home/

Ak sa ma vykonať každý týždeň v pondelok nastavte piatu položku na alebo mon:

 0 2 * * mon tar -zcf /var/backups/home.tgz /home/

V časovej položke je možné definovať aj viacej časov odelených čiarkov napr: vykonaj každý prvý desiaty a osemnásty deň v mesiaci:

 0 2 1,10,18 * * tar -zcf /var/backups/home.tgz /home/

Použitie pomlčky znamená: každý deň od 2 do 10

 0 2 2-10 * * tar -zcf /var/backups/home.tgz /home/

Lomítko nasledované číslom napríklad 3 znamená: každý tretí deň – príkaz sa teda vykoná prvý, štvrtý, siedmy… deň v mesiaci

0 2 1-15/3 * * tar -zcf /var/backups/home.tgz /home/
Našli jste v článku chybu?

24. 4. 2012 7:09

JirkaS (neregistrovaný)

Článek je pro začátečníky, takže jsem jej jen proletěl, zda tam nenarazím na něco, co ještě nevím. Samotný obsah musím pochválit, ale je tam spousta překlepů (nejvíc se opakuje 'spoll' místo 'spool') a minimálně tahle chyba:

časový údaj:

11 40 * * 1-4
Znamená spustiť príkaz od pondelka do štvrtku o 11:40. Hviezdička na prvom mieste by spustila príkaz každú minútu.

Pokud to tak má být, tak musí být 11 a 40 prohozeno.



13. 5. 2012 23:27

Hever (neregistrovaný)

anebo (prvni neděle v měsíci)

0 3 * * 7 [ `date '+%e'` -le 7 ] && mujskritp.sh

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

120na80.cz: Bojíte se encefalitidy?

Bojíte se encefalitidy?

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte