Prozkoumáme nástroj crontab, jeho jednotlivé příkazy a operace, které s ním souvisejí.
Podíváme se, jak se plánují úlohy s pomocí cron a na závěr si představíme některé online nástroje, které nám usnadní formátování a testování cron příkazů.
Vznik a význam
Crontab, neboli „cron table“, je odvozen z řeckého slova „Chronos“ znamenajícího čas. Jedná se o systémového démona, který automaticky provádí specifické úkoly a úlohy v předem nastavených časových intervalech.
Možnosti využití
Crontab se s výhodou používá pro automatizaci různých procesů, jako je zálohování dat, správa log souborů, synchronizace dat mezi počítači a odstraňování dočasných souborů. Je univerzální pro jakýkoliv typ úkolů, ale nejvíce se uplatní při správě systémových procesů.
Správci systému s pomocí cron mohou naplánovat spuštění úkolu na konkrétní čas a den.
Podívejme se tedy, jak se to dá nastavit.
Zápis v Crontab
Pro zpracování příkazů, cron čte konfigurační soubory. Při interpretaci řádků v těchto souborech se řídí syntaxí Crontabu. Každý řádek v Crontabu obsahuje šest polí, přičemž prvních pět definuje čas a datum spuštění. Šesté pole pak obsahuje uživatelské jméno a/nebo příkaz, skript či úlohu, která se má vykonat.
* * * * * UŽIVATELSKÉ JMÉNO PŘÍKAZ/SKRIPT
│ │ │ │ │
│ │ │ │ │
│ │ │ │ |_________ Den v týdnu (0 – 6), 0 je neděle (nebo použijte názvy dnů)
│ │ │ |____________ Měsíc (1 – 12), * znamená každý měsíc
│ │ |______________ Den v měsíci (1 – 31), * znamená každý den
│ |________________ Hodina (0 – 23), * znamená každou hodinu
|___________________ Minuta (0 – 59), * znamená každou minutu
Poznámky:
- Hvězdička (*) slouží jako zástupný znak pro všechny možné hodnoty v daném poli. Například, hvězdička v poli hodiny znamená každou hodinu a v poli měsíc každý měsíc.
Uživatelské jméno je volitelné (pouze pro systémové soubory crontab)
Příklady:
Pro lepší porozumění si syntaxi ukážeme na několika příkladech.
0 5 * * * /scripts/job.sh
1. Úloha se spustí každý den v 5:00.
0 6,18 * * * /scripts/job.sh
2. Úloha se spustí dvakrát denně, v 6:00 a 18:00.
* * * * * /scripts/job.sh
3. Úloha se spustí každou minutu.
0 19 * * mon /scripts/job.sh
4. Úloha se spustí každé pondělí v 19:00.
*/10 * * * * /scripts/job.sh
5. Úloha se spustí každých 10 minut.
* * * feb,jun,oct * /script/job.sh
6. Úloha se spustí pouze ve vybraných měsících: únor, červen a říjen.
25 7 4 3 * /home/script/backup.sh
7. Skript /home/script/backup.sh se spustí 4. března v 7:25.
8. Plánování úlohy každých 30 sekund.
- Jelikož cron nemá nativní podporu pro sekundy, musíme to obejít pomocí dvoufázového procesu.
* * * * * /home/scripts/script.sh
- Nejprve naplánujeme úlohu, aby se spouštěla každou minutu.
* * * * * sleep 30; /home/scripts/script.sh
Pomocí příkazu sleep pozastavíme provádění na 30 sekund.
Tato úloha se na 30 sekund pozastaví a poté se znovu spustí.
Typy konfiguračních souborů cron
Existují dva typy konfiguračních souborů cron:
Systémový Crontab (UNIX/Linux)
Vyžaduje oprávnění root, protože se obvykle používá pro systémové služby a kritické úlohy. Šesté pole, jak jsme si popsali výše, udává uživatelské jméno, pod kterým se má příkaz spustit. To umožňuje systému crontab spouštět příkazy jako kterýkoliv uživatel.
Uživatelský Crontab
Uživatelé mohou také nastavovat vlastní cron úlohy pomocí příkazu crontab. Zde je šesté pole příkaz, který se má spustit, a všechny příkazy se spouští pod uživatelem, který vytvořil crontab. Každý uživatel může mít svůj vlastní soubor crontab, ale i když jsou uloženy v /var/spool/cron/crontabs, neměly by se upravovat přímo. Pro úpravu nebo nastavení vlastních cron úloh je potřeba použít příkaz crontab.
Jak to funguje? Služba cron (démon) běží na pozadí a každou minutu kontroluje soubor /etc/crontab a adresáře /etc/cron.*/. Prohledává také adresář /var/spool/cron/. Příkazy se provádějí cronem
pokud aktuální čas odpovídá poli minuta, hodina a měsíc, a alespoň jednomu z polí den (den v měsíci nebo den v týdnu).
Základní příkazy
Zobrazení stávajících cron úloh
crontab -l
Pomocí následujícího příkazu můžeme vypsat všechny naplánované cron úlohy, aniž bychom museli otevírat konfigurační soubor.
[[email protected] ~]# crontab -l no crontab for etechblog.cz [[email protected] ~]#
Pokud nejsou nastavené žádné úlohy, zobrazí se výstup:
[[email protected] ~]# crontab -l # Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').# # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command 0 */1 * * * /home/account/scripts/updateAccountStatuses.sh 0 */1 * * * /home/account/scripts/reActivateAccountStatus.sh [[email protected] ~]#
Pokud uživatel již nějaké úlohy přidal, výstup bude vypadat následovně.
Cron tabulka je specifická pro každého uživatele. To znamená, že pro zobrazení seznamu cron úloh se musíte přihlásit pod konkrétním uživatelem.
Výpis cron úloh konkrétního uživatele
Pro zobrazení naplánovaných úloh jiného uživatele použijte přepínač -u (Uživatel) a -l (Seznam).
crontab -u jmeno_jineho_uzivatele -l
Příklad: crontab -u etechblog.cz -l
Přidání nebo úprava cron úloh
Pro úpravu cron úloh použijte volbu -e, jak je uvedeno níže.
crontab -e
Tento příkaz otevře editor vi, kde můžete zadat detaily úlohy a soubor uložit. Po uložení můžete pomocí crontab -l ověřit, zda je cron správně nastavený.
Přidání nebo úprava cron úloh pro specifického uživatele
crontab -u jiny_uzivatel -e
Následující příkaz slouží k úpravě crontab pro jiného uživatele.
Příklad: crontab -u etechblog.cz -e
Smazání cron úloh
Pomocí parametru -r lze odstranit naplánované úlohy bez dalšího potvrzení.
crontab -r
crontab -i -r
[[email protected] ~]# crontab -i -r crontab: really delete etechblog.cz's crontab?
Pokud chcete před smazáním úloh potvrdit, použijte přepínač -i s -r, který před smazáním crontabu uživatele vyzve k potvrzení.
Speciální řetězce Crontabu
Kromě výše probrané syntaxe můžeme používat i osm speciálních řetězců, které nám Crontab nabízí. Ušetří nám čas a zároveň zvýší čitelnost zápisu.
Speciální řetězec
Popis
@reboot
Spustit jednou po spuštění systému.
@yearly
Spustit jednou ročně, tj. 0 0 1 1 *
@annually
Stejné jako @yearly
@monthly
Spustit jednou měsíčně, tj. 0 0 1 * *
@weekly
Spustit jednou týdně, tj. 0 0 * * 0
@daily
Spustit jednou denně, tj. 0 0 * * *
@midnight
Stejné jako @daily
@hourly
Spustit jednou za hodinu, tj. 0 * * * *
Příklady speciálních řetězců Crontabu
1. Crontab pro naplánování úloh jednou ročně
@yearly /scripts/greeting.sh
Tento příklad můžeme použít například pro odeslání novoročního přání, které se provede v první minutě nového roku.
2. Crontab pro naplánování úloh jednou měsíčně.
@monthly /scripts/cleanup.sh
Výše uvedený příklad použijeme pro spuštění skriptu na úklid dat na začátku každého měsíce.
Podobně můžeme použít další speciální řetězce Crontabu pro týdenní, denní a hodinové účely.
Cron adresáře
- Správce systému může používat celosystémové plánování cron, které se nachází v předdefinovaných cron adresářích, viz níže:
- /etc/cron.d
- /etc/cron.daily
- /etc/cron.hourly
- /etc/cron.monthly
/etc/cron.weekly
Reálné příklady Crontabu
Nyní si probereme několik příkladů z reálného světa, které se běžně používají systémovými administrátory nebo IT profesionály.
Odstranění prázdných souborů a adresářů
45 0 * * * etechblog.cz najít /tmp -type f -empty -delete
Tento cron příkaz najde prázdné soubory a adresáře v /tmp a odstraní je. Tato úloha se spustí každý den ve 12:45. Pro vykonání úlohy je nutné uvést uživatelské jméno. Ve výše uvedeném příkladu uživatel etechblog.cz spouští operaci cron.
Spuštění více úloh pomocí jediného cronu
* * * * * /home/scripts/backup.sh; /home/scripts/script.sh
Více úkolů/úloh se odděluje středníkem (;) a lze je přiřadit jednomu cron výrazu.
Nástroje pro formátování a testování cronu
Zatím jsme si probrali příkazy a syntaxi crontabu pro plánování úloh. Pokud ale nejste správce systému a nenastavujete cron pravidelně, je těžké si pamatovat přesnou syntaxi, což může vést k chybám. Nemusíte se ale obávat, máme pro vás řešení.
Na internetu je dostupných několik nástrojů pro formátování cronu.
Má uživatelsky přívětivé grafické rozhraní, kam zadáte minuty, dny a cestu ke skriptu a vygeneruje crontab.
Podívejme se na reálný příklad, kde potřebuji spustit /home/processMonitor.sh každých 5 minut od pondělí do pátku.
Vygenerovala se mi tato syntaxe cron, kterou mohu vložit do svého crontabu spuštěním
crontab –e
0,5,10,15,20,25,30,35,40,45,50,55 * * * 1-5 /home/processMonitor.sh
Je praktický webový plánovač cron úloh. Úlohu cron si vytvoříme tak, že zadáme URL, které se má volat, a nastavíme čas spuštění. Můžeme zadat cron výraz nebo ho přidat ručně pomocí popisného formuláře. Pro vyšší zabezpečení můžeme volitelně použít základní HTTP autentizaci.
Easycron se dá použít pro další funkce, jako standardní cron výrazy, logy spouštění cron úloh, emailová upozornění, samostatné logy chyb a další.
Je to další užitečný nástroj pro generování crontabů, kde si také můžeme nastavit, jestli se má výstup z cronu ukládat do souboru nebo odesílat emailem.
Je jednoduchý online editor cron výrazů. Navíc poskytuje užitečný nástroj pro monitorování vaší cron úlohy. Stačí zkopírovat vygenerovaný příkaz a připojit jej na konec definice crontabu. V případě, že cron úloha selže nebo se nespustí, obdržíte upozornění e-mailem.
V následujícím příkladu se úloha spustí v 04:05, každý den, každý měsíc a každý den v týdnu.
Umožňuje nám testovat definice času a data cronu. Někdy potřebujeme dekódovat existující syntaxi cronu pro řešení problémů, nebo jen chceme provést test.
Pro tyto účely můžeme použít tento nástroj. Stačí zkopírovat a vložit cron výraz do pole, zvolit počet iterací a kliknout na Test, aby se zobrazila různá data, kdy se úloha spustí.
Otestujme si jeden z cron výrazů 4 3 */2 * *, který by měl běžet v 03:04 (AM) každý druhý den. Ověřme si to v cron testeru.
.