Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: grabtest 08. 03. 2018, 10:54:53
-
Ahoj potřeboval bych poradit.
Vytvářím jednoduchý skript ve kterém chci použit příkaz watch.
Například watch free -m.
No a teď to důležité :-) jde nějak zařídit, aby se onen watch zrušil, vypnul při dosažení určité hranice obsazení paměti?nebo obecně, přeruš watch, když nastane to a to, tam a tam :-),,,,a potom, aby zase pokračoval v běhu skriptu kde budou pokračovat další procesy.
Děkuji moc
P.
-
nebude to az take pekne v bashi, ale
watch free -m | tee output
a potom paralalne budes citat ten output subor a killnes watch pri splneni podmienky.
-
A proc neni lepsi ten sledovany prikaz radeji hodit do smycky?
-
Osobně bych na to nešel přes watch, ale přeparsoval bych výstup s pomocí příkazů grep a awk abych získal hodnotu, na základě které chci ukončit běh skriptu. Pak bych použil nějaký cyklus v Bashi...
-
Vytvářím jednoduchý skript ve kterém chci použit příkaz watch.
Například watch free -m.
Tvl to jsou mi nápady... Použít smyčku na vyčítání přímo z příkazů, není důvod používat "smyčku" přes watch, k tomu se to absolutně nehodí.
-
Panove v pohodě,
prostě jsem se zeptal,,,ale asi se mi to jeví jako hodne krkolomné :-/
Kazdopadne dekuji za ucast a navrhy :-)
P.
-
Mozna jeste mi poradite, kdyz pustim ve skriptu watch jako prvni proces, dalsi uz se mi nespusti,,,jak se prosim da zaridit, aby dalsi procesy se pustily jako pod spustenym watch procesem.
Dekuji
P.
-
ty jsi to nepochopil, watch vuubec poustet ve scriptu nemas ;)
jinak obecne pro pusteni na pozadi je:
prikaz &
ale pak neuvidis vystup, musel bys ho presmerovat do souboru a zpracovavat soubor, coz se dostavame opet k tomu ze je to nesmysl ;)
-
Nepomůže -e, --errexit
Freeze updates on command error, and exit after a key press.
Předpokládám, že command error je podle exit code. Místo free se dá použít něco jiného, co vrací požadovaný exit code, třeba skripty nagiosu,
/usr/lib64/nagios/plugins/check_mem.pl
check_mem.pl v1.0 - Nagios Plugin
usage:
check_mem.pl -<f|u> -w <warnlevel> -c <critlevel>
options:
-f Check FREE memory
-u Check USED memory
-C Count OS caches as FREE memory
-w PERCENT Percent free/used when to warn
-c PERCENT Percent free/used when critical
-
Mozna jeste mi poradite, kdyz pustim ve skriptu watch jako prvni proces, dalsi uz se mi nespusti,,,jak se prosim da zaridit, aby dalsi procesy se pustily jako pod spustenym watch procesem.
Dekuji
P.
celkovo chces multithreadovu aplikaciu a v tom bash nevynika :) chces v jednom vlakne zobrazovat watch, alebo hocico aktivne do terminalu a chces nejak citat ten vystup a robit rozhodnutia na zaklade toho co sa vykresluje. Najblizsie tomu co chces dosiahnut je tee ako som ti uz radil. Ale aj tak by si mal pouzit nejaky pokrocilejsi jazyk...
-
celkovo chces multithreadovu aplikaciu a v tom bash nevynika :) [...]
to by nebyl problem, to je nesmyslne pouziti watch ;-) v bash muze klidne pustit na pozadi toho kolik chce, muze i zobrazovat nekolik vystupu z procesu na pozadi s presmerovanym vystup, za pouziti rozdeleni okna pres byobu/tmux, nebo otevreni vice zalozek v terminalu, oboji lze nascriptovat...
-
ty jsi to nepochopil, watch vuubec poustet ve scriptu nemas ;)
jinak obecne pro pusteni na pozadi je:
prikaz &
ale pak neuvidis vystup, musel bys ho presmerovat do souboru a zpracovavat soubor, coz se dostavame opet k tomu ze je to nesmysl ;)
Ale uvidi vystup, poslanim do pozadi ze mu STDIN nezmeni, porad bude na terminalu ...
-
*STDOUT
-
Ono by asi nejlepsi bylo, kdyby tazatel napsal, co chce dosahnout.
Osobne jsem watch jeste v zivote nepouzil a nijak mi to nechybi
-
Uz jsem to dlouho nepouzival, ale co treba co-process , v bashi pry coproc, v ksh to bylo |&
https://unix.stackexchange.com/questions/86270/how-do-you-use-the-command-coproc-in-various-shells#86331
-
Ale uvidi vystup, poslanim do pozadi ze mu STDOUT nezmeni, porad bude na terminalu ...
opravdu vidis vystup "watch free -m &" ? ;)
-
Ale uvidi vystup, poslanim do pozadi ze mu STDOUT nezmeni, porad bude na terminalu ...
opravdu vidis vystup "watch free -m &" ? ;)
Urcite ho videt musi, & odesles aplikaci na pozadi, ale nepresmerujes vystup. Jak pravil @Blag
-
Ale uvidi vystup, poslanim do pozadi ze mu STDOUT nezmeni, porad bude na terminalu ...
opravdu vidis vystup "watch free -m &" ? ;)
Urcite ho videt musi, & odesles aplikaci na pozadi, ale nepresmerujes vystup. Jak pravil @Blag
I kdyz ne... Protoze watch nepouzivam uplne bezne (a nikdy jsem ho nepotreboval), tak ted jsem testem zjistil, ze treba na debianu to neukazuje vubec nic a pri stisknuti enteru se beh programu ukonci. Minimalne na debianu.
Vizte obrazek:
(https://imgur.com/a/4IGCx)
-
ty jsi to nepochopil, watch vuubec poustet ve scriptu nemas ;)
jinak obecne pro pusteni na pozadi je:
prikaz &
ale pak neuvidis vystup, musel bys ho presmerovat do souboru a zpracovavat soubor, coz se dostavame opet k tomu ze je to nesmysl ;)
Ale uvidi vystup, poslanim do pozadi ze mu STDIN nezmeni, porad bude na terminalu ...
Kdepak , vystup bude v nohup.out a STDIN je vstup
-
Co takhle misto pousteni skriptu s watch pustit watch se skriptem, kdyz uz tam ten watch musi byt?
-
I kdyz ne... [...] ted jsem testem zjistil, ze treba na debianu to neukazuje vubec nic[...]
take sem predtim naletel, kdyz to zkusil ciste v terminalu, kdyz to ale pustim ze scriptu, tak to zobrazuje a neukoncuje/nepozastavuje, tim ze script stale dale v nejake smycce zatim bezi :)
nicmene kdyz pak prijde vystup ze scriptu z neceho jineho, tak jde uplne dolu, takze se vystup free posune/rozpadne/zneviditelni, podle poctu radek vystupu... tohle by se scriptem bez watch take odpadalo...
Kdepak , vystup bude v nohup.out a STDIN je vstup
kdepak nohup.out nebude, dokud pred watch nenapise jeste nohup, coz uz by bylo jine zneni prikazu nez se psalo ;-)
ad STDIN to se Martin hned opravil ;-)
@tazatel abych nepsal jen ze watch je blbost, tak takhle je to kdyz bys hlidal hodnotu used ve vystupu free -m, pro hodnotu z jineho radku zmenis co grepujes, pro jinou pozici sloupce zmenis cislo u awk
limit="5000" # nastaveni limitu pri jehoz prekroceni se ma pokracovat dale
isused="$(free -m | grep Mem | awk '{print $3}')"
# dokud nebude splneno ze pouzito je vice nez nastaveny limit, smycka bezi
until [ "${isused}" -gt "${limit}" ]; do
clear # pokud se ma smazat obrazovka
free -m # pokud se ma zaroven zobrazit kompletni vystup
sleep 1 # cekat vterinu
isused="$(free -m | grep Mem | awk '{print $3}')"
done
echo "Vyuziti pameti ${isused} prevysilo nastaveny ${limit}, pokracuju dale..."
-
Pokd ma byt ucelem tohoto zoufaleho pinozeni merit metriku used memory, tak zkratka doporucuju nainstalovat Zabbix agent a pomoci zabbix-get se proste periodicky ptat na used memory key.
Neni uplne nutne vynalezat kolo
-
Uf, tak to se moc omlouvam, ze muj dotaz byl tak nesmyslny :-) Kazdopadne diky za tak plodnou diskuzi a je nad miru jasne, ze watch ve skriptu asi nic moc. Bohuzel nejsem az tak kovany v tvorbě skriptu a podobne,potreboval jsem neco jednoducheho ve smyslu "zeptej se tohohle procesu jakou ma hodnotu to a to a podle toho zareaguj takhle" muj predpoklad byl spatny to vytvaret v bash.
A konkretne o co jde? mam v praci servery na kterych bezi urcité databaze (sql) tyto servery jsou v modu active hotstanby a pri pouzití urciteho prikazu zjistim ktery z techto serveru je aktivni a ktery ne a po urcite době je potreba na tom aktivnim provest urcitou operaci, takze jsem si myslel ze by se to dalo delat automaticky prave pomoci bash skriptu.
A ten watch jsem chtel pouzit proto, jelikoz jiny proces mi ukaze stav pripojenych linek do jineho systemu a nekdy se holt stane, ze ta linka se chova nekorektne a je potreba udelat opatreni a to ze se ty servery preklopi.
P.
-
K původnímu dotazu: watch může spouštěnému skriptu předat svůj PID a skript může zabít svého rodiče.
-
Uf, tak to se moc omlouvam, ze muj dotaz byl tak nesmyslny :-) Kazdopadne diky za tak plodnou diskuzi a je nad miru jasne, ze watch ve skriptu asi nic moc. Bohuzel nejsem az tak kovany v tvorbě skriptu a podobne,potreboval jsem neco jednoducheho ve smyslu "zeptej se tohohle procesu jakou ma hodnotu to a to a podle toho zareaguj takhle" muj predpoklad byl spatny to vytvaret v bash.
A konkretne o co jde? mam v praci servery na kterych bezi urcité databaze (sql) tyto servery jsou v modu active hotstanby a pri pouzití urciteho prikazu zjistim ktery z techto serveru je aktivni a ktery ne a po urcite době je potreba na tom aktivnim provest urcitou operaci, takze jsem si myslel ze by se to dalo delat automaticky prave pomoci bash skriptu.
A ten watch jsem chtel pouzit proto, jelikoz jiny proces mi ukaze stav pripojenych linek do jineho systemu a nekdy se holt stane, ze ta linka se chova nekorektne a je potreba udelat opatreni a to ze se ty servery preklopi.
P.
Tak nevim, tohle zadání bych asi nebastlil, stejně neošetříš všechno, na to jsou jistě nějaké opensource nástroje.
P.S. Sorry za ten nohup, pozdě večer :-)