Hlavní navigace

Cron: naplánovanie opakujúcich sa procesov

24. 4. 2012
Doba čtení: 6 minut

Sdílet

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:

ict ve školství 24

 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/

Autor článku