Linux: Kniha kouzel, vanilková příchuť 1.17 (27. února 2022)
Veškerá moc příkazové řádky/příkazového řádku přehledně, pro začátečníky i pokročilé

11. Plánování úloh

Řada 1.x vanilkové příchuti Linuxu: Knihy kouzel je od 1. října 2020 do 1. března 2023 ve stavu dlouhodobé pasivní údržby; nahlášené chyby budou opravovány, ale aktivní vývoj se již věnuje novější vývojové řadě určené pro novější verze operačního systému a programů. Pokud nejste vázáni na starší verze programů, doporučuji vyhledat novou verzi z aktivně vyvíjené vývojové řady.
čas tematický okruh

1. Úvod

V této kapitole se dozvíte, jak spouštět příkazy automaticky v určený čas. Linux na tento účel poskytuje dva oddělené mechanismy: prastarý démon „cron“ slouží k pravidelnému (opakovanému) spouštění příkazů, zatímco méně věhlasný „at“ slouží k naplánování jednorázových úkolů, které budou spuštěny a zapomenuty. V praxi se ale ke spouštění opakovaných úloh používá i at, jen je potřeba v rámci každého spuštění úlohy naplánovat její další spuštění.

Mezi cronem a atem je ještě jeden podstatný rozdíl: pokud v době, kdy má naplánovaná úloha proběhnout, počítač neběží, cron dané spuštění jednoduše vynechá, zatímco at spustí naplánovanou úlohu, hned jak to bude možné.

Oběma mechanismům je také společné omezení přesnosti – spuštění lze nastavit jen s přesností na minuty. Potřebujete-li přesnější zacílení, je třeba, aby si přesný čas ohlídal až spuštěný proces.

Poznámka: Každý uživatel má vlastní seznam úloh a ty se spouštějí pod jeho uživatelským účtem. Vedle toho existují i systémové úlohy, spouštěné pod účtem superuživatele, ty však nejsou touto verzí kapitoly pokryty.

2. Definice

3. Zaklínadla

3/1 Pravidelné úlohy (obecně)

Plán – viz podsekci „Pravidelné úlohy (plány)“.

přidat nebo nahradit úlohu (spustit na pozadí/spustit v grafickém prostředí)#1
lkk pridat-ulohu id-úlohy plán 'příkaz a parametry'
lkk pridat-ulohu id-úlohy plán '~/bin/spustit-v-x příkaz a parametry'
vypsat seznam úloh (id je na konci řádku, za znakem „#“)/vypsat konkrétní úlohu#2 (1)
crontab -l
crontab -l | egrep '#id-úlohy$'
zrušit úlohu/všechny úlohy#3
crontab -l | egrep -v '#id-úlohy$' | crontab -
crontab -r
změnit plán úlohy#4 (2)
crontab -l | gawk '{ if (/#id-úlohy$/ && match($0, /^(([^ ]+ ){5}|@[a-z]+ )/)) {print nový-plán substr($0, RLENGTH)} else {print}}' | crontab -
uložit tabulku úloh do souboru/načíst ze souboru#5
crontab -l > soubor
crontab soubor
vypsat cizí seznam pravidelných úloh#6
sudo crontab -l -u cílový-uživatel

3/2 Pravidelné úlohy (systémové)

vypsat seznam systémových pravidelných úloh#1

3/3 Pravidelné úlohy (plány)

spouštět každou hodinu/každou hodinu od 10.00 do 15.59#1
"číslo-minuty * * * *"
"číslo-minuty 10-15 * * *"
spouštět každou minutu#2
"* * * * *"
spouštět každých pět minut (alternativy)#3
"*/5 * * * *"
"0,5,10,15,20,25,30,35,40,45,50,55 * * * *"
spouštět hned po startu systému/spouštět po přihlášení#4
"@reboot"
spouštět denně/denně, ale jen od pondělí do pátku#5
"číslo-minuty číslo-hodiny * * *"
"číslo-minuty číslo-hodiny * * 1-5"
spouštět týdně, každé pondělí/každou neděli#6
"číslo-minuty číslo-hodiny * * 1"
"číslo-minuty číslo-hodiny * * 7"
spouštět měsíčně v N-tý den měsíce#7
"číslo-minuty číslo-hodiny N * *"
spouštět v druhé a čtvrté pondělí od května do září včetně (celý příkaz)#8 (3)
lkk pridat-ulohu id-úlohy "číslo-minuty číslo-hodiny 8-14,22-28 5-9 *" 'test $(date +%u) -eq 1 && příkaz'
spouštět jednou ročně v určitý den#9
"číslo-minuty číslo-hodiny číslo-dne-v-měsíci číslo-měsíce *"
spouštět v poledne 29. února každého přestupného roku#10
"0 12 29 2 *"
spouštět v poledne každou adventní neděli (celý příkaz)#11 (4)
lkk pridat-ulohu id-úlohy "0 12 * 11-12 7" 'test 1127 -le $(date +%m%d) -a $(date +%m%d) -le 1224 && příkaz'

3/4 Jednorázové úlohy

Plán – viz sekci „Jednorázové úlohy (plány)“. Plán se zde neuzavírá do uvozovek!

přidat úlohu#1
printf "%s\\n" 'příkaz' | at plán
vypsat úlohy (číslo úlohy je v prvním sloupci)#2
atq
zrušit úlohu/všechny úlohy#3
atrm číslo-úlohy
atq | cut -f 1 | xargs -r atrm
změnit plán úlohy#4
vypsat obsah úlohy#5
at -c číslo-úlohy

3/5 Jednorázové úlohy (plány)

spustit v přesně zadaný čas/31. prosince 2030 ve 2 hodiny a 3 minuty#1 (5)
hodina:minuta [rok-měsíc-den]
02:03 2030-12-31
spustit při příštím startu systému/při příštím přihlášení#2
spustit dnes/zítra v 15.30#3
15:30 today
15:30 tomorrow
spustit příští úterý ve 12.00#4
12:00 next tuesday
spustit v poledne druhého dne příštího měsíce#5

4. Parametry příkazů

crontab -
crontab soubor
crontab parametry
at plán
atq
atrm číslo-úlohy
at -c číslo-úlohy

Poznámka: Příkaz „at“ očekává na standardním vstupu skript k provedení.

5. Instalace na Ubuntu

sudo apt-get install at gawk

Démon „cron“ je základní systémovou součástí Ubuntu a mnoha linuxových distribucí, proto zpravidla není třeba ho instalovat.

6. Ukázka

mkdir -pv ~/moje_ulohy
cd ~/moje_ulohy
printf %s\\n \
'cd' \
'sleep 7' \
'mplayer /usr/share/sounds/sound-icons/piano-3.wav &' \
'sleep 0.5' \
'notify-send -i dialog-information "Další minuta uplynula."' >uloha-minuta
lkk pridat-ulohu minuta "* * * * *" "~/bin/spustit-v-x bash ~/moje_ulohy/uloha-minuta"

Poznámka: ukázka vyžaduje nainstalovaný balíček „mplayer“ (a pochopitelně nainstalovaný pomocný skript „~/bin/spustit-v-x“).

7. Tipy a zkušenosti

8. Další zdroje informací

man 5 crontab
man 1 crontab
man at

9. Pomocné funkce a skripty

lkk pridat-ulohu – přidá nebo nahradí pravidelnou úlohu#1
#!/bin/bash -e
nazevulohy=$1 plan=$2
shift 2
(crontab -l 2>/dev/null | sed -E "/#$nazevulohy\$/d"; printf "$plan %s #$nazevulohy\\n" "$@" | sed -E 's/[\\%]/\\&/g') | crontab -
lkk spustit-v-x – slouží ke spouštění grafických aplikací z naplánovaných úloh#2 (6)
#!/bin/bash -e
function f () {
local xpid="$(pgrep -u "$(whoami)" '^[A-Za-z0-9]*-session$' | head -n 1)"
test -n "$xpid" || exit 1
eval "$(egrep -z '^(DBUS_SESSION_BUS_ADDRESS|DISPLAY|XDG_[A-Z_]+)=' /proc/$xpid/environ | tr \\0 \\n | sed -e s/=/\\n/ -e s/\'/\'\\\\\'\'/g | xargs -rd \\n printf "export %s='%s'\\n")"
}
f
exec "$@"
1 Poznámka: Znaky „\“ a „%“ jsou ve výpisu odzvláštněny, protože mají pro crontab speciální význam.
2 Vyžaduje nainstalovat balíček „gawk“.
3 Rozsahy dnů pro N-tý den týdne v měsíci jsou: první: 1-7, druhý: 8-14, třetí: 15-21, čtvrtý: 22-28, pátý: 29-31.
4 Uvedený příkaz využívá skutečnost, že adventní neděle se vyskytují pouze v období 27. listopadu až 24. prosince včetně.
5 Hodina, minuta, měsíc a den musí být zadány dvěma číslicemi.
6 Tento skript je vyžadován pro spouštění grafických aplikací z naplánovaných úloh. Pro správný běh takto spuštěných aplikací může být nutno doplnit do seznamu u příkazu „egrep“ mnoho dalších proměnných.
Zpracování videa a zvukuSystémSpráva uživatelských účtů