Přeskočit obsah

Přidávání CRON úloh (přes SSH)

V případě, kdy má zákazník k dispozici přístup přes SSH, může plánovat a spouštět úlohy Cronem pod svým uživatelským účetem, aniž by musel vznést požadavek na technickou podporu ohledně přidání záznamu do /etc/crontab. Uživatelské crontaby se v Debianu nacházejí ve /var/spool/cron/crontabs, název souboru tvoří uživatelské jméno. Tyto soubory nejsou editovány přímo, k jejich editaci slouží příkaz 'crontab -e'.

Struktura záznamu je tvořena určením času, kdy se má úloha spouštět. Čas spouštění udává pět sloupečků o následujcím významu:

Hodnoty se udávají v číslech, případně pokud má být úloha v daném sloupci spouštěna vždy, zapíše se *, tedy hvězdička. Pokud tedy chceme spouštět úlohu každý den v 1:45, záznam bude vypadat takto:

45 1 * * * uptime > /home/uzivatel/uptime.txt

Kdybychom tento příkaz chtěli spouštět pouze pátého v měsíci:

45 1 5 * * uptime > /home/uzivatel/uptime.txt

Dále existuje speciální zápis "hvězdička/číslo", například "*/5", což udává "každých 5". V prvním sloupečku tedy každých pět minut. Toto lze samozřejmě kombinovat s předchozími zápisy. Následující zápis tak bude spouštět naplánovanou úlohu každých pět minut, ale pouze pátého dne v měsíci:

*/5 * 5 * * uptime > /home/uzivatel/uptime.txt

Je také možné použít seznam hodnot oddělených čárkou a interval vymezený pomlčkou. Pokud se má příkaz spouštět prvního, pátého a desátého dne v měsíci, a to pouze v prosinci, vždy v 10 až 22 hodin každých pět minut, bude zápis následující:

*/5 10-22 1,5,10 12 * uptime > /home/uzivatel/uptime.txt

Poslední sloupeček, který zatím nebyl v příkladech zmíněn, udává číselnou hodnotu dne v týdnu. Pondělí je reprezentováno jedničkou, neděle sedmičkou. Pokud tedy budeme chtít spouštět příkaz vždy v pondělí, středu a pátek ve 12:00, bude zápis vypadat takto:

0 12 * * 1,3,5 uptime > /home/uzivatel/uptime.txt

Za definicí času spuštění následuje samotný příkaz. V globálním crontabu (/etc/crontab) by po udání času následoval uživatel, pod kterým se má příkaz spustit, zde to je to však z principu uživatelského crontabu jasné a následuje rovnou příkaz.

Typickým použitím Cronu na managed serveru jsou úlohy volající v určitý čas určitou URL, typicky v nočních hodinách nějaký skript pro údržbu databáze či import/export dat. Následující příklady budou zaměřeny na toto použití. Základní podoba příkazu, kdy je chybový výstup přesměrován do standardního a ten do /dev/null:

30 1 * * * curl http://www.nejakadomena.cz/skripty/udrzba.php > /dev/null 2>&1

V případě, že je volána adresa na https, kdy je SSL špatně nastaveno či certifikát není důvěryhodný:

30 1 * * * curl --insecure https://www.nejakadomena.cz/skripty/import.php > /dev/null 2>&1

V případě, že je třeba časově omezit dobu běhu skriptu (v sekundách):

30 1 * * * curl --max-time 300 https://www.nejakadomena.cz/skripty/udrzba.php > /dev/null 2>&1

V případě plánování spuštění náročné úlohy, která by mohla svým během zpomalit odezvu či snížit dostupnost na serveru provozovaných aplikací, je vhodné jí spustit s nižší prioritou.

30 0 1 * * nice -n 19 tar -zcvf /home/uzivatel/vsechny_weby.tar.gz /var/www

Číslo 19 zde reprezentuje úplně nejnižší prioritu. Standardně se proces spustí s prioritou 0, čím vyšší číslo, tím nižší priorita.

Pokud by vykonávání příkazu nebylo limitující pro procesor, ale server by trpěl na nedostatečnou propustnost při čtení/zápisu pevných disků, lze snížit prioritu I/O pro tento proces pomocí ionice:

30 0 1 * * ionice -c3 tar -zcvf /home/uzivatel/vsechny_weby.tar.gz /var/www

Hodnota 3 stanovuje procesu nejnižší prioritu pro I/O. Výchozí hodnota je 0, nejvyšší prioritu má 1. Příkazy nice a ionice lze samozřejmě zkombinovat, pouze takto ošetřený příkaz může být prováděn opravdu hodně dlouho.

V případě, kdy je nutné omezit dobu běhu skriptu, lze nastavit timeout (v sekundách), po jehož uplynutí bude proces natvrdo ukončen, pokud stále běží:

30 0 1 * * timeout 3600 tar -zcvf /home/uzivatel/vsechny_weby.tar.gz /var/www