Linux/Plánování spouštění úloh
< Linux
Řešení spouštění programů ne okamžitě, ale někdy v budoucnu. Unix-like systémy používají dva způsoby řešení:
- periodicky/opakovaně "někdy později"
- pomocí démonu "crond". Popis spouštění příkazů je uložen ve struktuře (souboru) zvané crontab. Globální systémový soubor popisu tohoto opakovaného spouštění je /etc/crontab, uživatelé mohou mít svůj popis - ten je pak uložen v souboru
/var/spool/cron/jméno_uživatele
. Globální specifikaci může ovlivnit pouze root a může ji tvořit/modifikovat přímo textovým editorem, uživatelská je přístupná pomocí příkazu "crontab
". Prvních pět polí řádky popisu jsou specifikace času, kdy se má daný příkaz vykonat. V globální specifikaci je jako šestý parametr jméno uživatele, pod kterým je daný program (sedmý parametr) spuštěn, v uživatelské specifikaci není - šestý parametr je specifikace programu a program je vždy spuštěn s UID uživatele.
Root může povolit/zakázat uživatele, kteří mohou používat spouštění úloh pomocí cron démonu, jejich vyjmenováním v souborech/etc/cron.allow
a/etc/cron.deny
. Zbytek řádky struktury crontab jsou parametry programu (tento zbytek je celý předán shell-u k vykonání, tzn. může to být zřetězení příkazů vč. přesměrování vstupů/výstupů). Implicitní shell je "/bin/sh", je možné specifikovat jiný shell deklarací proměnné SHELL. Speciální znak "%" bude démonem crond změněn na <LF> a vše za ním bude posláno na standardní vstup příkazu.
Blíže viz manuálové stránky cron a crontab. - jednorázově "někdy později"
- pomocí démonu "atd". Úlohy (je možno je zadat jak ze stdin tak ze vstupního souboru) se zařadí do časové fronty démona - pomocí příkazu at nebo batch; je možné je kdykoliv vypsat příkazem atq nebo je z časové fronty smazat příkazem atrm. Příkaz at má řadu voleb specifikace data a času spuštění úlohy.
! Pokud je specifikace data i času v daném dnu, musí být specifikace času první !
Root může povolit/zakázat uživatele, kteří mohou zařadit do fronty spouštění úloh pomocí at démonu, jejich vyjmenováním v souborech /etc/at.allow
a /etc/at.deny.
Blíže viz manuálové stránky at, batch, atq, atrm a atd.
# /etc/crontab - strucny popis a priklady: # # Format crontab (5 poli casu; u systemoveho je 6-te pole jmeno uzivatele, pod # jehoz UID prikaz pobezi a zbytek radky je spousteny prikaz) : # 1 - minuty (0-59) # 2 - hodiny (0-23) # 3 - dny v mesici (1-31) # 4 - mesic (1-12) # 5 - den v tydnu (0-7; 0 a 7 =nedele) # # Hvezdicka '*' znamena 'prvni-posledni', tj. splnuje vzdy # Rozsahy jsou ve tvaru 'cislo1-cislo2'; 8-11 v poli hodin znamena # vykonavani v 8,9,10,11 hodin # Seznamy jsou ve tvaru posloupnosti cisel, oddelenych carkami: # napr. 1,3,6,15. Seznamy a rozsahy mohou byt soucasne, napr. '0-4,18-23' # Rozsah muze zahrnovat inkrement ("krok"), takze hodnota '1-9/2' je # stejna jako 1,3,5,7,9 # # Komentar je radka zacinajici '#' (ev. po prazdnem znaku); nesmi byt za # prikazem cronu ani za nastavenim promenne environmentu. # cron automaticky nastavuje tyto promenne prostredi: SHELL="/bin/sh", # HOME a LOGNAME (podle /etc/passwd). Dale jsou na e-mail adresu v MAILTO # (implicitne vlastnik crontab-u) poslany vystupy (stdout + stderr) # spustenych prikazu. Posilani muze byt potlaceno nastavenim MAILTO="". # cron prohlizi polozky crontab kazdou minutu. Prikaz je spusten, pokud minuta, # hodina, mesic v roce a alespon jeden z obou poli dne (den v tydnu nebo den # v mesici) souhlasi s aktualnim casem. #------------------------------------------------------------------------------- # Priklad globalniho (System-wide) crontab-u "/etc/crontab". Od uzivatelskeho # se lisi tim, ze prikazova cast zacina jmenem uzivatele, pod kterym se prikaz # spousti. Take jej neni treba editovat pres prikaz `crontab' SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin MAILTO=root HOME=/ # script "run-parts" spousti ulohy ulozene v adresari danem jako parametr : 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly # Testovaci blbost spoustena kazdou minutu: * * * * * root echo "Test mail pro roota" # Delej neco kazdou lichou hodinu kazdy sudy den: * 1-23/2 */2 * * root /usr/local/sbin/delej_neco # Zalohovani dat 1 x tydne v noci z patku na sobotu (v 0:42) : 42 0 * * 6 root /usr/local/sbin/zal_data_tyden # Zalohovani dat 1 x mesicne prvniho v 0:42 : 42 0 1 * * root /usr/local/sbin/zal_data_mesic # Stazeni aktualizace neceho v Po-Pá v 5:45 a zaslani vystupu petrovi a pavlovi: MAILTO=petr,pavel 45 5 * * 1-5 root /usr/local/sbin/myDB_update #a MAILTO znovu nastavim na puvodni hodnotu (jinak bych tohle musel dat nakonec) MAILTO=root #upozorneni na obed (11:58 priprava, 12:00 odchod): 58 11 * * * root /usr/local/bin/obed_priprava 0 12 * * * root /usr/local/bin/obed_odchod #jakas synchronizace casu systemu denne v 5:58, 11:58 a 17:58, vystup potlacen: 58 5,11,17 * * * root /usr/local/sbin/nastav_date >/dev/null # Monitorovani teploty a ventilatoru kazdych 5 minut: */5 * * * * root /usr/local/sbin/test_teplota # Monitorovani prostoru na disku od 6:11 do 19:51 Pondeli-Patek: 11,31,51 6-19 * * 1-5 root /usr/local/sbin/test_disk_full # Priklad vybirani posty skolnim serverem: # leden-cerven, zari-prosinec: Po - Pa v 6:30 a 11:00 # So, Ne v 18:00 30 6 * 1-6,9-12 1-5 root /usr/local/sbin/inet_mail 0 11 * 1-6,9-12 1-5 root /usr/local/sbin/inet_mail 0 18 * 1-6,9-12 6,7 root /usr/local/sbin/inet_mail # # a cervenec, srpen: Po, St, Pa v 6:20 20 6 * 7,8 1,3,5 root /usr/local/sbin/inet_mail