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. Pro specifikaci intervalu je vyhrazeno prvních pět pozic řádku, oddělených mezerami - kde je ve výchozím stavu každá z nich zastoupena hvězdičkou. Za nimi pak následuje buď rovnou cesta k shellovému skriptu, nebo podmínky na jejichž základě se má úloha spustit.

Každá hvězdička, zastupuje jednu z položek specifikujících časový okamžik kdy má dojít ke spuštění, v následujícím pořadí: minuta, hodina, den, týden, rok. Ve výchozím stavu znamená, že ke spuštění úlohy může cron přikročit ihned, jakmile přijde na řadu

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

Přesný okamžik spuštění úlohy je specifikován pořadovým číslem příslušné položky. Bude-li místo první hvězdičky uvedeno číslo "1", pak bude cron úlohu spouštět co hodinu, každou první minutu.

Chceme-li úlohu spouštět opakovaně každých 10 minut, je třeba za hvězdičku zapsat lomítko a délku příslušného časového intervalu "*/10". Totéž platí pro všechny následující položky.

U jednotlivých položek lze použít také desetinou čárku. Podle následující konfigurace by došlo ke spuštění skriptu ... každý den přesně ve 23:30

Poznámka
0 23,5 * * * /usr/bin/php5 /home/nicovs/update_cron.php

Totéž lze zapsat i takto

Poznámka
30 23 * * * /usr/bin/php5 /home/nicovs/update_cron.php

Podmíněné spouštění úloh

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ěží.

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