Linux/Plánování spouštění úloh

Ř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