cron

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání

K plánovanému spouštění skriptů, v předem nastavených pravidelných intervalech, se v linuxu používá démon cron. Ten běží trvale na pozadí a zhruba každou minutu kontroluje obsah konfiguračních souborů zda-li pro daný čas nemají naplánovanou nějakou úlohu ke spuštění.

Konfigurační soubory, které kontroluje se mohou vyskytovat na několika místech. Výchozím konfiguračním souborem, který obsahuje plánované úlohy, které zajišťujících pravidelnou kontrolu a údržbu systému, je /etc/crontab. Mimo něj ale cron prohledává také obsah podadresářů v /var/spool/cron/crontabs/, kde jsou uloženy konfigurační soubory s naplánovanými úlohami jednotlivých uživatelů.

Debian však kromě těchto konfiguračních souborů zpracovává také se soubory z dalších, pro něj specifických adresářů:

/etc/cron.d/
Obsahuje konfigurační soubory cronu, které jsou součástí instalačních balíčků. Např. součástí php5-common je konfigurační skript cronu, který v určitou dobu provádí údržbu PHP a jeho skriptů.
/etc/cron.daily/
Obsahuje skripty které se mají spouštět každý den
/etc/cron.hourly/
Obsahuje skripty které se mají spouštět každou hodinu
/etc/cron.monthly/
Obsahuje skripty které se mají spouštět jednou měsíčně
/etc/cron.weekly/
Obsahuje skripty které se mají spouštět jednou týdně
Poznámka Na rozdíl od konfiguračních souborů cron z adresářů, jejichž název specifikuje interval spouštění, skripty rovnou spouští. Akceptuje přitom i symlinky na skripty v jiné lokaci.

Uživatelské plánování spouštění úloh

Úlohy se do uživatelských konfiguračních souborů nepřidávají jejich přímou editací, ale editací prostřednictvím aplikace crontab. Ta při prvním spuštění pro uživatele vytvoří samostatný soubor crontabs v podadresáři s jeho uživatelským jménem v rámci /var/spool/cron/crontabs/ a pak tento soubor otevře k editaci.

Použití plánovače úloh lze omezovat na základě uživatelského jména
/etc/cron.allow
pokud existuje tento soubor, mohou úlohy pro cron plánovat pouze uživatelé zde uvedení
/etc/cron.deny
pokud existuje tento soubor, tak úlohy pro cron mohou vytvářet pouze uživatelé co v něm nejsou uvedení


Syntaxe

Pro naplánování úlohy je podstatné vědět, jak cron pracuje s časem. Na řádku, kterým je plánováno spouštění úlohy, určuje prvních pět položek, oddělených mezerami, čas kdy má cron vykonat kód, který za nimi následuje. Ve výchozím stavu je na místě každé z nich hvězdička. Ta zastupuje každou číselnou hodnotu. Úlohu, načasovanou tak jak je uvedeno v následujícím příkladu, by cron spouštěl každou minutu.

Poznámka
* * * * *  /path/example.sh

Každá z položek však má svůj význam a přípustný rozsah:

  1. minuta (0-59)
  2. hodina (0-23)
  3. den v měsíci (1-31)
  4. měsíc v roce (1-12)
  5. den v týdnu (1-7) - 1 je pondělí
Upozornění Číselnou hodnotu, která není z tohoto rozsahu vyhodnotí cron jako chybu
Spouštění v určitý čas
23 * * * *
Bude-li místo první hvězdičky uvedeno kupř. číslo 23, pak bude cron skript /path/example.sh spouštět co hodinu, v každou dvacátoutřetí minutu.
1,23,37 * * * *
Čísel může být uvedeno i více, musí ale být odděleny čárkou. S uvedenými hodnotami by byl skript /path/example.sh spouštěn každou hodinu, vždy v určenou minutu.
*/3 * * * *
Má-li se spouštění realizovat opakovaně v pravidelném intervalu, pak se za hvězdičku oddělena lomítkem zapíše délka příslušného časového intervalu. V tomto případě by se skript /path/example.sh spouštěl opakovaně co tři minuty.
1-10 * * * *
Vymezením rozsahu lze nastavit, aby se úloha spouštěla opakovaně po dobu platnosti intervalu. Takto definovaná úloha by se opakovaně spouštěla každou hodinu po dobu prvních deseti minut
Podmíněné spouštění úloh

Cron sám o sobě neřeší co dělá kód v úloze. Proto pokud se má spouštět něco co samo o sobě Podmíněné spuštění úlohu obsahuje již předchozí příklad konfigurace, který zjišťuje zda-li již v některém procesu skript s názvem example.sh neběží.

Poznámka
* * * * *  /usr/sbin/pgrep example.sh ; [ $? != 0 ] && /path/example.sh

Podmínek však lze využívat i jiným způsobem - kupř. tehdy, je-li spuštění skriptu závislé na existenci adresáře, který se nachází na vzdáleném úložišti. Není-li v okamžiku spuštění úlohy úložiště k dispozici, místo spuštění zálohovacího procesu cron odešle e-mail s upozorněním.

Poznámka
* 2,5 * * * [ -d /cesta/k/adresáři ] && /volat/tento/skript || mail user@stroj

Konfigurace plánované úlohy cronu prostřednictvím puppet agenta

Poznámka
cron { 'update_cron':
    ensure  => 'present',
    command => '[ -d /cesta/k/adresáři ] && /volat/tento/skript || mail user@stroj',
    user => 'root', 
    hour => [ 23, 5 ], 
}
Upozornění Nastavení hodin v desetinném tvaru se provádí formou pole, nikoliv s použitím čárky, tak jak je tomu pak v konfiguračním souboru editovatelném přes crontab