Gentoo Linux Cron Guide Eric Brown Xavier Neys Jan "vopicak" Matějka Tato příručka popisuje jak nastavit a používat cron. 1.7 2006-02-20 Cron základy
Co cron dělá

Cron je démon který spouští naplánované úkoly založené na vstupu z příkazu crontab. Tyto příkazy udělá tak, že se vzbudí každou minutu a zkontroluje zda nemá nějaké cron-úkoly na práci v každém uživatelském crontabu.

Všimněte si, že crontab je jak jméno seznamu cron-úkolů, tak je také příkaz pro editaci onoho seznamu.
Cron, jinými slovy

Portage vám nabízí k vybrání z minimálně tří provedení cronu. Každy z nich vám nabízí podobné rozhraní zejména použití crontab nebo podobného příkazu. Portage nabízí dalši související pomůcky, jako například Anacron, který je určený k použití s cronem na systémech které neběží nepřetržitě.

Za povšimnutí také stojí, že všechny tři nabízené balíčky závisí na sys-process/cronbase. Ačkoli žádný z těchto cronů na tomto balíčku technicky vzato nezávisí, bude nainstalován kvůli funkcím podobným cronu, které mnoho uživatelů ocení.

Než začneme pracovat s cronem, musíte si zvolit, který cron chcete používat. Pro vaše pohodlí jsme shromáždili informace o každém z nich níže.

Který cron je pro Vás nejlepší?
Vixie cron

Vixie cron je plně vybavené provedení založené na SysV cronu. Každý uživatel má jeho vlastní crontab a má povoleno nastavovat proměnné prostředí uvnitř crontabu. Narozdíl od ostatních dvou cronů také nabízí podporu pro SELinux a PAM. Podporuje méně architektur než Dcron, ale více než Fcron.

Vlastnosti sys-process/vixie-cron:

  • Podporuje SELinux
  • Podporuje PAM /etc/security/limits.conf
  • Umožňuje nastavení proměnných prostředí v crontabech (PATH, SHELL, HOME, atd.)
  • Každý uživatel můze mít vlastní crontab, přístup je kontrolovaný přes cron.allow a cron.deny
Dillonův Cron

Dcron má za cíl být jednoduché, elegantní a bezpečné provedení cronu. Neposkytuje nastavování proměnných prostředí v crontabech a cron-úkoly jsou spouštěny z /bin/sh. Jako Vixie cron, každý uživatel má jeho vlastní crontab.

Vlastnosti sys-process/dcron:

  • Rychlý, jednoduchý a bez zbytečných vlastností.
  • Přístup k crontab je omezen na cron skupinu, tedy nespolehá se na žádné vnější faktory.
Fcron

Fcron si pokládá za cíl nahradit Vixie cron a Anacron. je navržen pro práci na nekontinuálně běžících systémech a obsahuje příslušné extra vlastnosti. Obsahuje úkolové omezovače, ovládání seřazení úkolů, schopnost přidělovat procesům hezké hodnoty a schopnost naplánování procesů ke spuštění po spuštění systému. Shlédněte fcronova domací stránka pro více informací.

Vlastnosti sys-process/fcron:

  • Navržen pro práci na nekontinuálně běžících systémech, čili pouští procesy po restartování pokud byly vynechány.
  • Nastavování proměnných prostředí a mnoho dalšich mozností v crontabech
  • Každý uživatel může mít jeho vlastní crontab, přístup je kontrolován přes cron.allow a cron.deny
  • Vylepšený crontab syntax s podporou pro mnoho nových vlastností
Anacron

Anacron není cron démon, je to něco co obvykle pracuje dohromady s jedním z cronů. Spouští příkazy v intervalech specifikovaných ve dnech a nepředpokládá, že systém běží nepřetržitě; spustí procesy které byly zmeškány když systém byl dole v dole. Anacron se obvykle spoléhá, že ho cron démon spustí každý den.

Používani cronu
Instalace

Vyberte cron který se Vám nejvíce líbí a poté ho emergněte.

# emerge dcron
# /etc/init.d/dcron start
# rc-update add dcron default

Volitelně, pokud jste nenainstaloval Fcron, mohl byste chtít nainstalovat Anacron.

# emerge anacron
# /etc/init.d/anacron start
# rc-update add anacron default
Systémový crontab

Post-instalační zprávy některých z těchto cronů Vám říkají, že je třeba spustit crontab /etc/crontab. /etc/crontab je Váš systémový crontab. Cron instalace jej muze využít ve spojení s sys-process/cronbase pro spouštění skriptů v /etc/cron.{daily,hourly,weekly,monthly}. Všimněte si, že jen Vixie-cron plánuje úkoly v /etc/crontab automaticky. Uživatelé Dcronu a Fcronu budou muset spustit crontab /etc/crontab pokaždé když udělají změnu v /etc/crontab.

Všimněte si, že úkoly naplánované v systémovém crontabu se nemusi objevit ve výpisu úkolů zobrazených pomoci crontab -l.

Samozřejmě si můžete zvolit nepoužívat systémový crontab. Pokud si vyberete Dcron nebo Fcron, nespuštějte crontab /etc/crontab. Pokud si vyberete vixie-cron, měli byste zakomentovat všechny řádky v /etc/crontab.

# sed -i -e "s/^/#/" /etc/crontab
Přidělování důvěryhodným uživatelům právo pro přístup ke cronu

Pokud chcete aby i jiní uživatelé něž kořen měli přístup ke cron démonu, přečtěte si tuto část, pokud ne, můžete pokračovat až další částí. plánvání cron-úkolů.

Povolení dalším uživatelům přístup ke crontabu jim nedovoluje spouštět cron-úkoly jako kořen. Pokud chcete aby tito uživatelé byli schopni upravovat kořenův crontab, podívejte se na sudo. Můžete si přečíst našeho Gentoo Sudo(erský) Průvodce pro více informací.

Bez ohledu na to který cron používáte, uživatélé kterým chcete povolit používat crontab musí být v ve skupině cron. Například pokud chcete přidat uživatele wepy do skupiny cron, spustíte:

# gpasswd -a "Aleš Máslo" cron
Když přidáte uživatele do skupiny cron, ujistěte se, že se uživatel odhlásil a znovu přihlásil aby se uvedly v platnost provedené změny (přidání uživatěle do skupiny).

Pokud používáte Dcron, je toto vše, co musíte udělat pro to, aby uživatel měl přístup ke crontab. Uživatelé Dcronu nyní mohou pokročit k další části. plánování cron-úkolů, všichni ostatní by měli číst dále.

Pokud používáte Fcron, budete chtít upravit /etc/fcron/fcron.deny a /etc/fcron/fcron.allow. Nejbezpečnější cesta je nejdříve zakázat všechny v /etc/fcron/fcron.deny a pote explicitně povolovat uživatele v /etc/fcron/fcron.allow.

Pokud ani /etc/fcron/fcron.allow ani /etc/fcron/fcron.deny neexistuje, potom všichni uživatelé ve skupině budou mít povoleno používat crontab. Fcron má jako výchozí nastavení fcron.allow, které dovoluje všem uživatelům ve skupině používat fcrontab.
all

Teď máme uživatele wepy, který může plánovat jeho vlastní cron-úkoly. Měli bychom ho přidat do /etc/fcron/fcron.allow například takto:

wepy

Pokud jste si zvolili Vixie cron, pravděpodobně budete chtít upravit jen /etc/cron.allow.

Pokud existuje pouze /etc/cron.allow, potom jen uživatelé zde a v cron skupině budou mit přístup. Pokud existuje jen prázdné /etc/cron.deny, potom budou mít přístup všichni uživatelé ve skupině cron.Nenechávejte prázdné /etc/cron.deny pokud nemáte zároveň /etc/cron.allow.

Například, pokud chcete povolit uživatele wepy, přidejte ho do /etc/cron.allow například takto:

wepy
Plánování cron-úkolů

Postup upravování crontabu pro různé balíčky cronů se různě liší, avšak každý z nich poskytuje stejnou základní sadu příkazů: přidávání, mazání, upravování, nahrazování crontabů a procházení cron-úkolů v crontabech. Následující seznam vám ukáže jak spouštět tyto příkazy pro každý z cronů.

dcroncrontab -ecrontab -d [uživatel]crontab souborcrontab -lfcronfcrontab -efcrontab -r [uživatel]fcrontab souborfcrontab -lvixie-croncrontab -ecrontab -r -u [user]crontab souborcrontab -l
Verze Upravit crontab Odstranit crontab Nový crontab Procházet cron-úkoly
Když spustíte odstranění crontabu bez argumentu, smaže to crontab aktuálního uživatele. Fcron má symlink z crontab na fcrontab.

Než můžeme používat tyto příkazy, je nutno nejprve porozumět crontabu samotnému. Každá řádka v crontabu musí obsahovat pět časových informací v následujícím pořadí: minuty (0-59), hodiny (0-23), dny v měsíci (1-31), měsíce (1-12), a dny v týdnu(0-7, Pondělí je 1, Neděle je 0 a 7). Měsíce a dny v týdnu mohou být určeny třípísmenými zkratkami - mon, tue, jan, feb, atd. Každé pole je schopno určit rozsah hodnot (napr. 1-5 nebo mon-fri), čárkou oddělený seznam hodnot (napr. 1,2,3 nebo mon,tue,wed) nebo rozsah hodnot s krokem (napr. 1-6/2 jako 1,3,5).

Zní to trochu zmateně, ale po pár příkladech uvidíte, že to není tak složité.

# Spustí /bin/false každou minutu celý rok
*     *     *     *     *        /bin/false

# Spustí /bin/false v 1:35 v mon,tue,wed (pon,ute,str) a 4. každý
měsíc
35    1     4     *     mon-wed  /bin/false

# Spustí /bin/true v 22:25 2. Března
25    22    2     3     *        /bin/true

# Spustí /bin/false ve 2:00 každé Pondělí, Středu a Pátek
0     2     *     *     1-5/2    /bin/false
Všimněte si, jak musíte zadávat konkrétní dny v týdnu a dny v měsíci než jsou zkombinovány. Pokud mate * pouze pro jedny z nich, ty druhé si berou prioritu, pokud je * v obou, znamená to prostě každý den.

Pro vyzkoušení toho, co jsme se zrovna naučili, vložme nějaké cron-úkoly. Nejprve vytvořte soubor crons.cron a obsah uspořádejte podobně jak vidíte níže.

$ nano crons.cron
#Minuty  Hodiny  Dny   Měsíce  Dny v týdnu
10     3      1      1       *       /bin/echo "Nemám rád cron"
30     16     *      1,2     *       /bin/echo "Trochu mám rád cron"
*      *      *      1-12/2  *       /bin/echo "Mám rád cron"

Teď můžeme přidat tento crontab do systémového crontabu pomocí "příkazu nový" z tabulky výše.

# crontab crons.cron
Neuvidíte výstup z těchto echo příkazů pokud nepoužívate přesměrování.

Pro kontrolu cron-úkolů, které jste naplánovali, použijeme příslušný procházet příkaz z tabulky výše.

# crontab -l

Měli byste vidět seznam podobající se crons.cron, pokud ne, možná jste použili špatný příkaz pro vložení Vašeho nového crontabu.

Tento crontab by měl vypsat "Mám rád cron" každou minutu, každou hodiny, každy den, každý měsíc. Očividně toto uděláte pouze když opravdu máte rádi cron. Crontab dále vypíše "Trochu mám rád cron" v 16:30 každý den v Lednu a Únoru. A ještě vypíše "Nemám rád cron" vždy v 3:10 1. Ledna.

Pokud používáte Anacron, měli byste dale číst tuto část. Pokud ne, pokračujte následující částí na upravování crontabů.

Uživatelé Anacronu, budou chtít upravit /etc/anacrontab. Tento soubor má čtyři pole: počet dnů mezi každým spuštním, zpoždění v minutách po kterém se to spustí, jméno úkolu, a příkaz ke spuštění.

Například pro spuštění echo "Mám rád anacron" každých 5 dnů, 10 minut po spuštění Anacronu byste měli mít:

5 10 wasting-time /bin/echo "Mám rád anacron"

Anacrn se ukončí po provedení všech úkolů v anacrontabu. Takže pokud chceme spouštět tyto úkoly každý den, budeme muset použít cron. Instrukce na konci další části Vám řeknou jak na to.

Upravování crontabů

Buďme realističtí. Určitě nechcete aby vám systém každou minutu říkal jak moc máte rádí cron. Jako krok kupředu, odstraňme tento crontab pomocí příslušného odstraňovacího příkazu z tabulky výše. Poté vypišme seznam cron-úkolů, jen pro ujištění, že to proběhlo správně.

# crontab -d
# crontab -l

Neměli byste teď vidět žádné cron-úkoly ve výstupu crontab -l. Pokud vidíte, znamená to, že se nepovedlo odstranit crontab, a že byste se měli ujistit, zda jste použili správný odstraňovací příkaz.

Teď, když máme čistý štít, vložme něco užitečného do kořenového crontabu. Většina lidi chce spouštět updatedb jednou za týden, kvůli aktualizování databáze pro příkaz slocate. Pro přídání updatedb do Vašeho crontabu, nejprve upravte crons.cron znovu tak, aby obsah vypadal podobně jako následující:

22 2 * * 1    /usr/bin/updatedb

Toto by mělo říct cronu, aby spustil updatedb pokaždé ve 2:22 v Pondělí ráno každý týden. Teď byste měli přidat crontab příslušným příkazem nový z tabulky výše a opět zkontrolovat seznam.

# crontab crons.cron
# crontab -l

Řekněme, že teď chcete přidat ještě emerge --sync do vašeho denního plánování. Můžete to udělat tak, že nejprve upravíte crons.cron a pote použitím crontab crons.cron přesně tak, jak jsme udělali dříve, nebo mužete použít příslučný příkaz upravit z tabulky výše. Toto vám dává možnost jak upravovat uživatelský crontab bez závislosti na vnějších souborech jako crons.cron.

# crontab -e

Toto by Vám mělo otevřít uživatelský crontab v editoru. Chceme spouštět emerge --sync každý den v 6:30, takže to zapíšeme nějak takhle:

22 2 * * 1    /usr/bin/updatedb
30 6 * * *    /usr/bin/emerge --sync
(pokud používáte anacron, přidejte tento řádek)
30 7 * * *    /usr/sbin/anacron -s

Znovu zkontrolujte seznam cron-úkolů jako jsme dělali v předchozích příkladech. Pokud tam všechny jsou, je vše dobře.

Používání cronbáze

Jak jsme zmínili dříve, všechny tři dostupné balíčky cronů jsou závislé na sys-process/cronbase. Cronbase balíček vytváří /etc/cron.{hourly,daily,weekly,monthly} a skript run-crons. Možná jste si všimli, že výchozí /etc/crontab obsahuje něco takového:

*/15 * * * *     test -x /usr/sbin/run-crons && /usr/sbin/run-crons
0  *  * * *      rm -f /var/spool/cron/lastrun/cron.hourly
0  3  * * *      rm -f /var/spool/cron/lastrun/cron.daily
15 4  * * 6      rm -f /var/spool/cron/lastrun/cron.weekly
30 5  1 * *      rm -f /var/spool/cron/lastrun/cron.monthly

Abysme nezacházeli do moc detailů, můžeme přijmout jen to, že tyto příkazy spustí Vaše hourly, daily, weekly a monthly skripty. Tato metoda plánování cron-úkolů má pár důležitých výhod:

  • Spustí se i pokud Váš počítač byl vypnutý v době, kdy se měli spustit
  • Je jednoduché pro vývojáře balíčků umísťovat skripty do těchto dobře určených míst
  • Víte přesně kde jsou Vaše cron-úkoly a Váš crontab uloženy, což vám zjednodušuje zálohování a obnovu zěchto částí Vašeho systému
Znovu, je užitečné uvědomit si, že Vixie cron automaticky čte /etc/crontab, zatímco dcron a fcron ne. Prosím přečtěte si Systémový crontab část pro dozvědění se více.
Závěrečné Poznámky
Odstraňování problémlů

Pokud máte problemy s nastavením cronu aby pracoval jak Vy chcete, můžete si projít tento rychlý seznam.

  • Je cron spuštěný ?
    Spusťte ps ax | grep cron a ujistěte se, že se zde oběví!
  • Funguje Vám cron ?
    Zkuste: * * * * * /bin/echo "foobar" >> /soubor_který_vlastníte a ujistěte se, že funguje
  • Funguje Váš příkaz ?
    Zkuste: * * * * * /bin/foobar > /soubor_který_vlastníte 2>&1 a hledejte chyb v /soubor_který_vlastníte
  • Může cron spustit Váš úkol ?
    Zkontrolujte cron log, obvykle /var/log/cron.log nebo /var/log/messages zda zde nejsou nějaké chyby
  • Jsou tam nějaké dead.letter?
    cron obvykle posílá mail pokud nastane problém, zkontrolujte Váš mail a koukněte se do ~/dead.letter.

Pamatujte, každý cron balíček je odlišný v jeho rozsahu vlastností. Přečtěte si manuálové stránky Vašeho konkrétního cron balíčku.

Hodně Štěstí!