Cron je Linux/Unix systémový nástroj, který spouští různé programy v předem definovanou dobu a intervalu (obdoba naplánovaných úloh ve Windows). Každý trošku vyspělejší webový projekt, stojící na výše jmenované platformě, se bez tohoto systémového démona neobejde. Popíši vám jak ho zkrotit pro vlastní potřeby.

Démon cron používají převážně Linux/Unix administrátoři ke spouštění programů a skriptů, které pomáhají udržovat operační systém. Například mazáním pomocných souborů, které po sobě některé nepořádné aplikace zachovají, nebo prováděním pravidelného zálohování databází či celých disků.

Samozřejmě tento démon může velice dobře pomoci i tvůrcům internetových projektů. Jeho pomocí můžete v intervalech spouštět například generování databázově velmi náročných stránek, nebo můžete získávat aktuální informace z různých zdrojů na internetu, třeba aktuální kurzovní lístek, o kterém jsem psal dříve. Můžete také například promazávat různá nepotřebná data v databázi, nebo… Nechávám vaší fantazii a potřebám.

Pokud používáte webhostingových služeb, pravděpodobně nebudete mít ke cronu přímý přístup přes příkazový řádek, takže vás nemusí zajímat jeho konfigurace. Pokud systém používáte sami pro sebe, nebudete se muset jeho konfigurací také příliš zabývat, jelikož jako root k němu budete mít přístup vždy. Pokud ale plánujete cron dovolit více uživatelům, kteří se budou moci k systému nalogovat k příkazové řádce, bude dobré nastavit uživatele, kteří s ním budou a nebudou moci pracovat. Standardně k němu mají přístup všichni uživatelé.

Chcete-li přístup omezit jen na určité uživatele, budete muset nastavit jména těchto uživatelů do souborů cron.allow a cron.deny. Oba soubory byste měli najít v /usr/lib/cron nebo /etc/cron.d (záleží na konfiguraci jednotlivých systémů). Pokud chcete povolit přístup jen uživateli jirka a pavel, napíšete do souboru cron.allow jejich uživatelská jména. Každé na jeden řádek. Tím všem ostatním uživatelům přístup ke cronu znemožníte. Pokud byste chtěli výše uvedeným uživatelům přístup zakázat a ostatním ho povolit, uvedete jejich uživatelská jména do souboru cron.deny. Stejně jako u předchozího souboru se píše jeden uživatel na jeden řádek. Samozřejmě uvedená uživatelská jména by měla v systému existovat (měly by být v souboru /etc/passwd). Pokud tyto soubory neexistují, bude mít ke cronu přístup pouze superuser (root).

Když už víme, co budeme chtít pomocí cronu spouštět, musíme určit i čas spuštění. Cron nelze použít k jednorázovému spouštění aplikací či skriptů – cron spouští definované aplikace vždy v předem definovaném intervalu. Nutno podotknout, že tento interval je minimálně 1 minuta. Pokud potřebujete spouštět program častěji, bude asi vhodnější nechat program běžet permanentně a program na určitou dobu pauzovat.

Ke spouštění aplikací pomocí cronu jsou dvě možnosti. Prvá spočívá v nakopírovaní aplikace do jednoho z adresářů /etc/cron.daily, /etc/cron.hourly, /etc/cron.weekly a /etc/cron.monthly. Již z názvů těchto adresářů je jasné, jak často se budou aplikace v těchto adresářích spouštět. Pokud ale potřebujete přesnější časování, nebo jiný interval, budete muset přistoupit k utilitě crontab. Tato utilita slouží ke správě seznamů úloh, které cron vykonává. Každý uživatel má vlastní seznam úloh.

Pokud zavoláte crontab s parametrem -e, otevře se přednastavený textový editor a v něm bude obsah seznamu úloh. Pokud v seznamu nemáte žádný záznam, bude samozřejmě prázdný. Záznam do seznamu úloh má šest parametrů oddělených mezerami nebo tabelátory:

1. minuta
2. hodina
3. den v měsíci
4. měsíc
5. den v týdnu (0 – neděle, 1 – pondělí… 6 – sobota)
6. cesta k programu, který má cron spustit

Pokud místo některého z prvních pěti parametrů napíšete * (hvězdičku), znamená to, že parametr není definován. Příklad několika zápisů do seznamu úloh:

0 1 * * * /www/cgi-bin/skript.cgi
5 1 * * * /backup/make_backup
* 2 * * * wget http://www.server.cz/stahuj.php
0 0 1 * * /backup/delete_www_log
0,5,10,15,20,25,30,35,40,45,50,55 * * * *
   /www/cgi-bin/generuj_sessions.cgi

První řádek spouští skript.cgi každý den v 1:00 ráno. Druhý řádek cronu říká, aby spouštěl program make_backup denně v 1:05 ráno. Třetí řádek bude volat program wget, který bude stahovat obsah zadané internetové adresy – spustí se každou minutu od 2:00 do 2:59. (I když máme definovanou hodinu, nedefinovali jsme minutu, tudíž se cron bude pokoušet spouštět úlohu každou minutu v danou hodinu.)

Čtvrtý řádek tohoto příkladu bude spouštět program, který zazálohuje a následně vymaže log web serveru. Svou činnost bude provádět vždy na začátku nového měsíce. Poslední řádek bude spouštět skript každých pět minut.

Pravděpodobně budete chtít použít cron ke spouštění PHP skriptů. Před tím ale bude dobré zjistit, zda je na serveru PHP zkompilováno jako CGI verze, zda existuje spustitelný program php. Pokud ne, budete muset spouštět PHP skript pomocí programu wget, který jej zavolá obdobně jako internetový prohlížeč. Tento způsob má však několik nevýhod. Mezi hlavní nevýhodu patří možný timeout nastavený pro provádění PHP skriptů, takže takto volaný skript nemusí dokončit svou práci včas. Druhá nevýhoda je, že skript zbytečně vytěžuje webový server a tím snižuje i výkon celého serveru, spuštění a následné provádění PHP skriptu z příkazové řádky je mnohem rychlejší.

Pokud tedy na serveru máte nainstalováno PHP i jako CGI verzi, máte dvě možnosti, jak PHP skript spustit. První možnost, která nepotřebuje zásah do skriptu, je zavolání PHP interpretu a předání parametru, který bude obsahovat cestu k PHP skriptu. Příklad zápisu:

0 1 * * * /bin/php -f /www/server/skript.php

Druhá možnost spočívá v úpravě PHP skriptu. Skript se pak stává samostatně spustitelným programem obdobně jako CGI verze. Skript bude možná potřebovat více úprav, ale ta zásadní je v uvedení cesty k interpretu PHP do prvního řádku zdrojového kódu a přidělení execute práv tomuto skriptu.

#!/bin/php
phpinfo();

Takovýto skript pak cronem zavoláte následujícím způsobem:

0 1 * * * /www/server/skript.php

V obou případech je nutné pamatovat, že cesty k případným vloženým či otevíraným souborům musí být uváděny absolutně. Jinak by mohlo docházet k chybám, protože interpret PHP by nenašel požadované soubory. Výhodou spouštění PHP skriptů pomocí dvou posledně uvedených metod je menší zátěž systému.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

8 Příspěvků v diskuzi

  1. Děkuji za popis cronu. Jen pro úplnost bych dodal použití lomítka; tj. potřebuji-li něco spuštět např. každých 5 minut, do editoru napíši */5 * * * * /www/cgi-bin/generuj_sessions.cgi

  2. Zdravím, potřeboval bych poradit. Chci na serveru spouštět automaticky script. Pochopil jsem, že na to mám jít přes cron, ale nevím, jak dostat příkaz do crontabu.

  3. Měla jsem script napsaný tak, že při ručním spuštění vypisoval co dělá, po spuštění v cronu se začaly vytvářet logy….jak má být správně napsané logování tak, aby se ten log přepisoval?
    30 9 * * * root wget http://cesta/mujscript.php > /dev/null 2>&1

  4. zedituj crontab prikazem „crontab -e“ , predtim si ale nastav vychozi editor jelikoz se ti editace otevre ve vi, tzn. pokud pises napr. ve vim pust nasledujici command „export EDITOR=vim“

    Co se tyce samotneho crontabu tak zadavat velice jednouduse tzn. napr. pokud chci kazdou 15min a 45min v hodine vyvolat urcity script tak takhle

    15 * * * * /home/eddie/Scripts/ping.sh
    45 * * * * /home/eddie/Scripts/ping.sh

  5. Ahoj.
    Dneska jsem začal objevovat crontab a pomocí příkazu „crontab -e“ jsem zapsal toto:

    * * * * * wget localhost/my.php

    ale nic se neděje. Skript má vyrobit soubor a každou minutu do něj zapsat čas, což se neděje, takže usuzuju, že cron nefunguje. Co s tím? Musím někde něco restartovat, nebo tak nějak?

  6. Dobrý den, mám dotaz. Používám openSuse a snažím se zrpovoznit crontab. Mám vytvořený skript (/home/kalabis/script/mujskript). Pomocí crontab -e jsem přidal 1 * * * * /home/kalabis/script/mujskript . Jsem si vědom toho,že tento skript se bude vykonávat každou minutu. Potíž je v tom, že se potom nic neděje. Můžete mi někdo pomoc?

    • Ta jednicka na minutovem parametru dela to, ze ten vas skript spusti v kazde prvni minute kazde hodiny kazdeho dne (00:01, 01:01, 02:01, atd.), nikoliv kazdou minutu, jak jste si vedom. Zkuste to jinak pane kolego :)

Odpovědět