• Vítejte na XBMC-Kodi.cz
  • Česko-slovenská komunita fanoušků XBMC/Kodi
Vítejte návštevníku! Přihlášení Registrace


Hodnocení tématu:
  • 1 Hlas(ů) - 5 Průměr
  • 1
  • 2
  • 3
  • 4
  • 5
Tvheadend BB (Black Box) NEO
#2
Ad Ostatní - scripty: Uspávání serveru při nečinnosti

Celkem očekávaná záležitost, kterou ale někdo opomíjí a nechává server běžet soustavně. Také bych sice mohl, můj HW není nijak žravý, ale z principu jsme si upsávání serveru při nečinnosti ve svém projektu ujít nenechal.

Začnu probouzením, i když to není záležitost serveru. Ale chci-li server uspávat, měl bych mít plán, jak ho také umět probudit, tedy jinak než svými vlastními silami, externími událostmi. Tento typ probouzení mají na starosti jednotliví klienti. A řeším ho dvojím způsobem. U stabilních Kodi instalací (všechny jsou *ELEC), mám vložené do startup scripru (.../.config/autostart.sh) nebo do místa, kde se spouší scripty pro probuzení (../.config/sleep.d/), scripty, které server v potřebném okamžiku probudí. U těch ostatních (vesměs jsou to PC s jiným primárním určením než je jen Kodi platforma) nechávám probouzení servevu na samotné aplikaci Kodi, případně jeho addons.

A teď tedy k uspávání serveru. Scriptů, které to řeší, je plno a najít je na interetu je záležitost chvilky. Udělal jsme to stejně a zjistil, i když to na první pohled tak nevypadá, že je to vlastně strašně jednoduché. Je třeba mít samozřejmě nějaké základy scriptování (já pro to používám ten nejjednodušší sh shell), pak se hodí znalost Tvheadend web api (na to je dobré se podívat na post Tvheadend a web api) a pak nějakou základní představu o tom, jak chci, aby to fungovalo. Současnou verzi (ještě značně nedokonalou, ale v základních obrysech už funkční ukáži v závěru), teď tedy o tom, jak chci, aby to fungovalo. Co je třeba si stanovit?
  • kdy a jak chci script spouštět - často se spouštění scriptu odvozuje od skončen nahrávání. Já jsem si to ale zobecnil a script spouštím periodicky. Důvodem je to, že chci, aby script řešil i jiné situace, než jen spojení s vlastním Tvheadend apliakcí. Používám tedy cron. Peridou spouštění zatím neřeším, pro ladění script buď spouštím ručně nebo si nastavím nějakou krátkou peridou, ale pro praktické používání to vidím na nějakých 10 nebo 15 minut.
  • co všechno by se na rozhodnutí o tom, že se má/nemá server uspat, podílet - to je hodně individuální a závisí to na tom, co všechno (kromě Tvheadend) na serveru porvozujete a také, jaký systém práce máte zavedený. Mě z toho vyšly následující kritéria (záměrně píši o situacích, kdy server nechci uspat, respektive uspání blokovat, brzy uvidíte proč):
    • je aktivní alespoň jeden webový klient (port 9981) - tzn. na nějakém webovém prohlížeči je zobrazeno gui Tvheadend
    • na serveru je spuštěné gui operačního systému - to bych mohl bez problémů na serveu pracovat
    • zatím nekontroluji přihlášení, ale brzy to také přidám - z podobného důvodu jako v přechozím bodu
    • na serveru běží vybrané aplikace - v dané chvíli testuji pouze běh Webgrab++, ale tuto část brzy zobecním a přibude možnost jednoduše zadat další aplikace, jejichž běh bude uspání blokovat
    • je aktivní alespoň jeden klient Tvheadend (port 9982) - tady jsem obvyklá řešení trochu doplnil, netestuji puze aktvního klienty (přes web api), ale protože v některých situacích (např. uspání Kodi) to trvá delší dobu než spojení spadne, testuji ještě jejich aktuální dostupnost (ping). Tento poslední test není samozřejmě nutný. Pokud není použit, tak prostě serveru bude uspání trvat trochu déle, než spojení vyhodnotí jako "vypadlé".
    • běží alespoň jedno nahrávání
    • pokud všechny testy dopadnou tak, že je možné serevr uspat (tzn. nic neblokuje uspání) následuje zjištění data a času přístího nahrávání (pokud žádné není - což se prakticky asi stát nemůže, ale budiž - to tak se nastavuje probuzení na zítřejší den), které se (po nezbytném přidání rezervy) dále použije jako čas porbuzení
    • no a ještě obligátní test, zda by další probuzení nemělo proběhnout za příliš krátkou dobu a nevyplatí se tedy, nechat server raději běžet
    • pokud se dojde až sem, tam pak už jen obligátní nastavení času probuzení a nakonec vlastní uspání
  • jak by script měl vypadat - jak už jsme napsal, je takových scriptů celá řada, mně se ale žádný z nich moc nelíbil. Byly příliš nepřehledné a orientace v nich nepříliš jednoduchá. Stanovil jsem si jednoduchou zásadu. Ve scriptu budou za sebou uspořádány jednotlivé testy, v nichž se v každém bude testovat, zda má server běžet dál. Poku test dopadne dobře, tak se běh scriptu v tomto místě ukončí a k uspání serveru nedojde. Je to přehledné, velice rychle a jednoduše se přidávají další podmínky a také se, což je dobré pro ladění na živém systému, velice rychle a jednoduše mění pořadí podmínek.
  Součásná verze scriptu (v0.2) je zde:
Kód:
#!/bin/sh

# Version v0.2
# TV Server suspend script
# Dependencies: curl, jq

# Parameters

addsec=3600
presec=60

timetostop=5

# Common

name=[SERVER]

# Debug & test parameters

noexit=
nowake=
noexec=

logger ${name} Warming
sleep 15
logger ${name} Start

[ ${noexit} ] && logger ${name} NOEXIT mode
[ ${nowake} ] && logger ${name} NOWAKE mode
[ ${noexec} ] && logger ${name} NOEXEC mode

# Check who logged - prepared for future function

logged=$(who)
users=$(who -q | grep -E "users|uživatelů" | cut -f2 -d=)
logger ${name} Login criteria ${users} user: ${logged}


# Check for active connections - Tvheadend web gui clients

match=$(netstat -an | grep -iE "SPOJENO|ESTABLISHED" | grep -E "9981")
if [ $? = 0 ] ; then
    logger ${name} At least one general connection is active, continue...
    [ ! ${noexit} ] && exit
fi

# Check for running gui

match=$(ps -e | grep gnome)
if [ $? = 0 ]; then
    logger ${name} GUI runs, continue...
    [ ! ${noexit} ] && exit
fi

# Check for running wg++

match=$(ps -e | grep run.sh)
if [ $? = 0 ]; then
    logger ${name} WG++ runs, continue...
    [ ! ${noexit} ] && exit
fi

# Check for active connections - Tvheadend front-end clients

json=$(curl -s "http://localhost:9981/api/status/connections")

count=$(echo ${json} | jq -r '.totalCount')
entries=$(echo ${json} | jq '.entries')
lenght=$(echo ${entries} | jq '.|length')
logger ${name} Tvheadend status - Connection: ${count} Entries: ${lenght}
i=0
while [ ${i} -lt ${lenght} ] ; do
    peer=$(echo ${entries} | jq -r ".[${i}]|.peer")
    resp=$(ping -c 1 ${peer})
    if [ $? = 0 ] ; then
        logger ${name} Client IP: ${peer} is alive
        logger ${name} At least one client is alive, continue... 
        [ ! ${noexit} ] && exit
    else
        logger ${name} Client IP: ${peer} is dead
    fi
    i=$((i+1))
done

# Check for recordings

json=$(curl -s "http://localhost:9981/api/dvr/entry/grid_upcoming?limit=99999")

# Check for recordings - active recordings

match=$(echo ${json} | grep -c '"sched_status":"recording",')
if [ $? = 0 ]; then
    logger ${name} Recording runs, continue... 
    [ ! ${noexit} ] && exit
fi

# Check for recordings - next recording

next=$(echo ${json} | tr , '\n' | grep start_real | sed "s/.*start_real.:\([0-9]*\).*/\1/" | sort -n | head -1)
if [ ${next} ] ; then
    next=${next}
    logger ${name} Next recording at $(date -d @${next})
else
    next=$(date -d "tomorrow" +%s)
    logger ${name} No recording, next activity tomorow at $(date -d @${next}) 
fi

# Check gap to next activity

gap=$((${next}-$(date +%s)))
logger ${name} Next recordig/activity start at ${gap} sec
if [ ${gap} -lt 300 ] ; then
    logger ${name} Gap to next recording is too short, continue...
    [ ! ${noexit} ] && exit
fi

# Set the wakeup and go to stop

wakeup=$((next-presec))
logger ${name} Waking up at $(date -d @${wakeup})

wakeup=$((wakeup-addsec+addsec))

[ ! ${nowake} ] && sudo /usr/sbin/rtcwake -m no -t ${wakeup} > /dev/null

logger ${name} Waiting for stop in ${timetostop} seconds
sleep ${timetostop}

[ ! ${noexec} ] && sudo /usr/sbin/pm-suspend &

logger ${name} Suspend

exit (0)
Jak už jsem tu napsal několikrát, nejsem programátor a všechny tyto věci řeším s manuálem v ruce (či spíše na obrazovce), proto buďte shovívaví. Samozřejmě budu velice rád za každý dobrý nápad či námět, stejně jako konstruktivní kritiku.

To-Do:
  • samozřejmě jde  o úplně první verzi, na které budu ještě pracovat, takže ke změnám bude ještě docházet
  • zatím jsou všechny parametry v kódu, v dalším kroku vše přepíši do proměnných a umístím je do úvodu scriptu tak, aby adaptace na kontrétní podmínky a použití byla co nejjednodušší
  • ještě bych rád doplnil probuzení pro běh některých dalších úloh - např. již zmíněné wg++ či případných dalších. Znamená to vložit jako čas probuzení místo data a času další nahrávky datum a čas spuštění úlohy, pokud tento předchází datu a času další nahrávky. Tohle trochu bourá tu jednoduchu systematičnost řešení, ale není to nic, co by se vyřešit nedalo, jen se mi do toho ještě nechtělo.
  • co se týče parametrů, zvažuji vytvoření externího parametrizačního souboru, ve kterém budou uložené parametry. Tohle by bylo určeno pro ty méně zkušené, takže by si pak jen nakopírovali dva soubory, script a soubor s parametry, soubor s parametry by podle návodu vyplnili, nastavili by si cron a ... 

EDIT 2020-11-16: Poněkud jsem upravil výše uvedený script. Do jeho verze v0.1 se mi vloudila chybička, na kterou jsem přišel bohužel až později. Zároveň jsem doplnil i možnost spouštění scriptu bez toho, že by skutečně do běhu systému zasahoval. Je to dobré pro ladění a testování.
Jsem (až na výjimky) pouhým čtenářem fóra.
Nepokračuji tedy ani v tématech, která jsem založil.
To platí i pro doplňky Kodi a další aplikace, které jsou s takovými tématy spojené.
 
Citovat
  


Příspěvků v tématu
Tvheadend BB (Black Box) NEO - od JiRo - 09.11.2020, 15:22
RE: Tvheadend BB (Black Box) - od JiRo - 15.11.2020, 13:40
RE: Tvheadend BB (Black Box) - od JiRo - 17.11.2020, 13:11
RE: Tvheadend BB (Black Box) - od JiRo - 05.12.2020, 21:08
RE: Tvheadend BB (Black Box) - od tdanicek - 04.1.2021, 12:34
RE: Tvheadend BB (Black Box) - od JiRo - 04.1.2021, 12:44
RE: Tvheadend BB (Black Box) - od JiRo - 05.11.2021, 2:03
RE: Tvheadend BB (Black Box) - od JiRo - 16.5.2024, 15:03
RE: Tvheadend BB (Black Box) NEO - od JiRo - 19.5.2024, 16:00
RE: Tvheadend BB (Black Box) NEO - od JiRo - 19.8.2024, 13:21
RE: Tvheadend BB (Black Box) NEO - od JiRo - 21.11.2024, 10:25
RE: Tvheadend BB (Black Box) NEO - od JiRo - 16.7.2025, 12:41
RE: Tvheadend BB (Black Box) NEO - od top9 - 16.7.2025, 20:13
RE: Tvheadend BB (Black Box) NEO - od JiRo - 16.7.2025, 20:20
RE: Tvheadend BB (Black Box) NEO - od top9 - 17.7.2025, 8:32
RE: Tvheadend BB (Black Box) NEO - od meda - 17.7.2025, 12:46
RE: Tvheadend BB (Black Box) NEO - od JiRo - 17.7.2025, 13:27

Přejít na fórum:


Prochází: 1 host(ů)