sobota 11. prosince 2010

Cron - démonický plánovač úloh

Cron je démon, který umožňuje spouštět programy a skripty v nastavenou dobu. Může vám spustit zálohu dat, nebo třeba měnit tapetu na pracovní ploše podle denní doby. Informací je o něm na internetu spousta, ale shrnu to, co jsem zatím potřeboval sám.


Cron využívá konfiguračních souborů crontab, které se definují pro každého uživatele zvlášť, a ty kontroluje každou minutu - nejkratší časový úsek, po kterém můžete nějakou akci opakovat, je tedy jedna minuta. Crontab se edituje příkazem:

$ crontab -e

Pro editaci crontabu jiného uživatele, musíte mít práva superuživatele a použít přepínač -u:

$ sudo crontab -u user -e

Pokud jste přihlášeni jako root (třeba přes příkaz sudo su), nepoužijete sudo. Nechcete-li editovat, ale jen zobrazit obsah crontab, použijete místo přepínače -e přepínač -l.

Při první editaci crontabu budete dotázáni na editor, ve kterém se bude soubor upravovat (osobně používám nano, které je i doporučeno jako nejjednodušší možnost), a založí se nový soubor, v jehož úvodu je nápověda. Přidávat budete řádky v této syntaxi:

m h dom mon dow command

Význam je následující:
m (Minute)                Minuta v hodině - (0 - 59), * hvězdička pro každou minutu
h (Hour)                    Hodina dne (0 - 23), * hvězdička pro každou hodinu
dom (Day of Month)   Den v měsíci (1 - 31), * hvězdička pro každý den
mon (Month)             Měsíc v roce (1 - 12), * hvězdička pro každý měsíc
dow (Day of Week)   Den v týdnu (0-6), přičemž 0 znamená neděli a * hvězdička každý den
command                Příkaz(y), který se má v zadanou dobu provést

Časové údaje můžete definovat jako konkrétní hodnotu, rozsah (např. 2-6), seznam (2,4,6), nebo násobek (např. */5 pro opakování každých pět minut, hodin, atd.).
Cron rozumí i pár speciálním řetězcům, kterými můžete nahradit výše popsaný způsob zápisu času:

řetězec      význam
@reboot     spustit jednou po restartu systému
@yearly     jednou za rok - "0 0 1 1 *".
@annually   stejné jako @yearly
@monthly    jednou za měsíc - "0 0 1 * *".
@weekly     jednou za týden - "0 0 * * 0".
@daily      jednou denně - "0 0 * * *".
@midnight   stejné jako  @daily
@hourly     jednou za hodinu - "0 * * * *".

Proměnné prostředí
Při zadávání příkazů do crontabu je potřeba myslet na to, že výchozím shellem je v prostředí cronu /bin/sh, což je v případě Ubuntu odkaz na /bin/dash (výchozím shellem terminálu v Ubuntu je /bin/bash). Nejsou zde definovány všechny systémové proměnné, jako naříklad $DISPLAY, která je nutná pro spouštění grafických aplikací, aby věděly, kam se mají kreslit, $LANG, podle níž se načítá do programů lokalizační soubor a v $PATH je pouze /usr/bin:/bin. Když si otevřete terminál, můžete zjistit hodnoty těchto proměnných ve vašem systému zadáním např. echo $DISPLAY apod. a pak je v crontab definovat podle potřeby příkazem pro změnu prostředí - env. Příkladně, pro spuštění komunikátoru Pidgin každý den, kromě neděle, v 9:00 přidáte do crontab tento řádek:

0 9 * * 1-6   env DISPLAY=:0 LANG="cs_CZ.UTF-8" /usr/bin/pidgin

Bez definice $LANG by se program spustil ve výchozím jazyce, tedy anglicky, a $DISPLAY zde určuje, že se použije výchozí obrazovka.
Pro spuštění sekvence bash příkazů, můžete v cronu použít příkaz bash s přepínačem -c:

0 9 * * 1-6   bash -c "příkaz; příkaz; ..."

Grafický nástroj pro editaci crontab
Pokud máte raději klikací nástroje, máte možnost si doinstalovat program Gnome Schedule, který může práci s cronem zjednodušit především začátečníkům.

$ sudo apt-get install gnome-schedule

Anacron
Pokud vám počítač neběží neustále a zapínáte ho nepravidelně, je tu ještě program Anacron, který sice není schopen menšího rozlišení, než jeden den, ale oproti Cronu nepropásne akci jen proto, že v danou chvíli počítač neběží. Po každém spuštění zkontroluje, zda v daném období byly spuštěny všechny naplánované úlohy a pokud ne, napraví to a uloží si o tom záznam. Pokud tedy naplánujete akci na pondělí, ale počítač v neděli vypnete a opět zapnete až ve středu, provede se ona pondělní akce ve středu. Na druhou stranu se zas nedá konfigurovat pro každého uživatele zvlášť. Neběží jako démon, ale spouští se nejčastěji při startu systému. Více snad doplním časem, zatím odkážu na manuál (man anacron).

Odkazy:

Žádné komentáře:

Okomentovat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.