Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: grabtest 08. 03. 2018, 10:54:53

Název: Příkaz watch v bash skriptu
Přispěvatel: 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.
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: asdf111 08. 03. 2018, 11:12:11
nebude to az take pekne v bashi, ale
Kód: [Vybrat]
watch free -m | tee output a potom paralalne budes citat ten output subor a killnes watch pri splneni podmienky.
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: tf 08. 03. 2018, 12:11:40
A proc neni lepsi ten sledovany prikaz radeji hodit do smycky?
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: kultu 08. 03. 2018, 12:42:13
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...
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: ByCzech 08. 03. 2018, 14:12:04
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í.
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: grabtest 08. 03. 2018, 14:17:04
Panove v pohodě,
prostě jsem se zeptal,,,ale asi se mi to jeví jako hodne krkolomné :-/
Kazdopadne dekuji za ucast a navrhy :-)
P.
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: grabtest 08. 03. 2018, 14:26:31
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.
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: nobody(ten pravej) 08. 03. 2018, 15:28:07
ty jsi to nepochopil, watch vuubec poustet ve scriptu nemas ;)

jinak obecne pro pusteni na pozadi je:
Kód: [Vybrat]
prikaz &ale pak neuvidis vystup, musel bys ho presmerovat do souboru a zpracovavat soubor, coz se dostavame opet k tomu ze je to nesmysl ;)
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: tt 08. 03. 2018, 15:50:30
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

Název: Re:Příkaz watch v bash skriptu
Přispěvatel: asdf123 08. 03. 2018, 15:56:10
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...
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: nobody(ten pravej) 08. 03. 2018, 16:19:50
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...
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: Blag 08. 03. 2018, 16:38:05
ty jsi to nepochopil, watch vuubec poustet ve scriptu nemas ;)

jinak obecne pro pusteni na pozadi je:
Kód: [Vybrat]
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 ...
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: Blag 08. 03. 2018, 16:38:24
*STDOUT
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: Youda 08. 03. 2018, 17:29:26
Ono by asi nejlepsi bylo, kdyby tazatel napsal, co chce dosahnout.
Osobne jsem watch jeste v zivote nepouzil a nijak mi to nechybi
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: KshGuy 08. 03. 2018, 17:32:30
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
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: nobody(ten pravej) 08. 03. 2018, 18:03:31
Ale uvidi vystup, poslanim do pozadi ze mu STDOUT nezmeni, porad bude na terminalu ...
opravdu vidis vystup "watch free -m &" ? ;)
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: Martin 08. 03. 2018, 18:52:01
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
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: Martin 08. 03. 2018, 18:57:44
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)
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: KshGuy 08. 03. 2018, 19:46:51
ty jsi to nepochopil, watch vuubec poustet ve scriptu nemas ;)

jinak obecne pro pusteni na pozadi je:
Kód: [Vybrat]
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
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: JardaP . 08. 03. 2018, 20:18:23
Co takhle misto pousteni skriptu s watch pustit watch se skriptem, kdyz uz tam ten watch musi byt?
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: nobody(ten pravej) 09. 03. 2018, 00:46:22
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
Kód: [Vybrat]
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..."

Název: Re:Příkaz watch v bash skriptu
Přispěvatel: Youda 09. 03. 2018, 00:57:25
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
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: grabtest 09. 03. 2018, 08:39:32
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.
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: Kit 09. 03. 2018, 09:58:50
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.
Název: Re:Příkaz watch v bash skriptu
Přispěvatel: KshGuy 09. 03. 2018, 20:09:59
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 :-)