Č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
a /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 zapíš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/