Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: exkalibr 30. 08. 2023, 15:28:59

Název: Podmínka while nefunguje dle očekávání
Přispěvatel: exkalibr 30. 08. 2023, 15:28:59
Proč bash skript spuštěný po startu OS z ~/.profile píše:
"System activity is 20.00 below 10.25%. Starting memory monitoring."?

Pokud je system activity 20.00 tak nemá dojít k volání funkce monitor_memory . Má k tomu volání monitor_memory dojít až když je aktivita pod 10.25 ... Kde PŘESNĚ je chyba?
Kód: [Vybrat]
mpstat_activity_float() {
  local idle=$(mpstat | awk 'NF >= 1 {idle += $(NF)} END {print idle}')
  local activity=$((100 - idle))
  # local activity=$(awk -v idle="$idle" 'BEGIN {print 100 - idle}')
  printf "%.2f\n" "$activity"
}

# Funkce na čekání na snížení aktivity pod určitou úroveň
# Spouští monitor_memory &
function waiting_on_system_ready_monitor_memory() {
  local target_activity=10.25
  local current_activity=$(mpstat_activity_float)
 
  while (( $(echo "$current_activity >= $target_activity" | bc -l) )); do
    sleep 120  # Dvouminutové intervaly
    current_activity=$(mpstat_activity_float)
  done

  echo "System activity is $current_activity below $target_activity%. Starting memory monitoring."
  monitor_memory &
}

# Zajistit čekání na připravenost systému
waiting_on_system_ready_monitor_memory &
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: Sam 30. 08. 2023, 16:02:33
Rekl bych otocena podminka ;-)

pi@raspberrypi:~$ cat sam.sh
#!/bin/bash
current_activity=12.5
target_activity=20
echo $(echo "$current_activity >= $target_activity"  )
echo $(echo "$current_activity >= $target_activity" | bc -l  )


pi@raspberrypi:~$ ./sam.sh
12.5 >= 20
0
pi@raspberrypi:~$
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: Sam 30. 08. 2023, 16:16:28
Mas z toho spusteni kompletni log ? Zkus misto bc dat plnou cestu k bc ;-)

Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: exkalibr 31. 08. 2023, 17:43:25
Log myslíte jako log standardní, který soubor? Nebo log ladící?

Zjednodušeně pseudokodem tomu rozumím takto:

Dokud je podmínka 20 >= 10.25 dělej sleep 120...

Až se systém uklidní tak bude

Dokud je podmínka 10.00 >= 10.25 (bude tedy nepravda) dělej sleep 120...
čili: "nedělej sleep 120" ale rovnou přejdi na spuštění funkce monitor_memory
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: dikobraz24 02. 09. 2023, 18:52:49
Profil exkalibr je hacknutý, odcizen.  Píšu tedy ze starého profilu, který jsem náhodou objevil pod jinou svou emailovkou. Když se spouští ten ~/.profile tak třeba při aktivitě 54% to vypíše (standard_in): syntax error.
Název: desetiná čárka je jádro pudla `bc`
Přispěvatel: mikesznovu 02. 09. 2023, 20:50:20
asi 4.věc, co jsem zkusil (třetí byla nainstalování apt install bc) bylo zkusil progam bc s desetinou čárkou:
echo "1,2 > 6" | bc -l
(standard_in) 1: syntax error
 echo "1,2 < 6" |  tr , . |bc -l
0


Takže tam PŘESNĚ je chyba.

Zkusil bych místo nějaké onanie s mpstat + awk (+ tr , .) + printf bych zkusil rovnou číst příslušnou hodnotu v /sys nebo /proc

Zkušení dělníci bashe urcite poradí



Tohle sice můžeš zkusit, ale je to takové hrabání se v kanalizaci  (potrubí)
...|tr  , .  |...


Prostě bash je  programovací jazyk k zblití!


(Aby to nevypadalo namachrovaně, já bych tohle z fleku v sh nedal) ,ale zkusil bych normální skriptovací jazyk a neparsoval bych výstupu prográmků, ale četl z /proc
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: k3dAR 02. 09. 2023, 22:58:39
Kód: [Vybrat]
#!/bin/bash

mpstat_activity_float() {
    current_idle="$(mpstat -o JSON | jq '.sysstat.hosts[].statistics[]."cpu-load"[].idle')"
    current_activity=$(echo "scale=2; 100 - ${current_idle}" | bc)
}

function waiting_on_system_ready_monitor_memory() {
    target_activity="10.25"
    mpstat_activity_float

    while (( $(echo "${current_activity} >= ${target_activity}" | bc -l) )); do
        sleep 120
        mpstat_activity_float
    done

    echo "System activity is ${current_activity} below ${target_activity}%. Starting memory monitoring."
    monitor_memory &
}

jak psal mikesznovu, bc chce desetinou . ne ,
prepsal sem to na vice mistech:
- zjiskani idle hodnoty z mpstat pres jeho JSON vystup a parsovani pres jq nastroj (btw: tu je hodnota rovnou s . misto ,)
   (a nectu jen int cislo abych pres printf mu pridal .00, ale nechavam realne hodnotu na 2 desetina)
- nepouziti local promenejch to je asi vec zvyku
- s tim ^ souvisi mpstat_activity_float nepouzit na nastaveni promene z printf, ale rovnou v te funkci globalni promenoiu

- promene davej do {}, mas to pak prehlednejsi jak pri obarvovani syntaxi, tak kdyz chces pozdeji nahradit ci dohledat konkretni nazvy promenych

EDIT:
jinak v tom tvym scriptu by bez tr slo (schopnost bashe) jen promene pro bc nechat nahrazovat , za . (opet narazime na promenou v {} :-)
while (( $(echo "$current_activity >= $target_activity" | bc -l) )); do
=>
while (( $(echo "${current_activity/,/.} >= ${target_activity/,/.}" | bc -l) )); do
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: a234 03. 09. 2023, 16:41:33
Nepouziva printf oddelovac desetinnych mist podle lokalizace? Pak by to mohl byt pripad jako tady https://stackoverflow.com/questions/12845638/how-do-i-change-the-decimal-separator-in-the-printf-command-in-bash (https://stackoverflow.com/questions/12845638/how-do-i-change-the-decimal-separator-in-the-printf-command-in-bash).
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: z_sk 03. 09. 2023, 23:56:06
Správne má byť:
Kód: [Vybrat]
LANG=C printf "%.2f\n" "$activity"
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: k3dAR 04. 09. 2023, 02:24:19
Správne má byť:
Kód: [Vybrat]
LANG=C printf "%.2f\n" "$activity"
vzhledem k tomu ze nad tim pracuje bez destinejch mist a tim printf pridava .00 uz muze rovnou byt:
Kód: [Vybrat]
echo "${activity}.00"(pokud tedy nechce prejit na realne desetina mista z idle jak je v mem prikladu vejs :-)
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: exkalibr 13. 09. 2023, 21:53:14
Dík všem kdo přispěli. Dík za reakce.

Po delší pauze (celková apatie něco dělat na linuxu) jsem to s AI vyřešil a nevím jak ale našel jsem to co vy. Problém byla čárka. Takže skript funguje, ale co je divné že tam je stále vytištěná chyba. Napsal jsem debug funkci, která píše co to dělá. Teď ale nejsem na (VM) linuxu a nemám nervy to znovu spouštět. Už jednou jsem se nasral, že jsem to restartoval (celý PC, 2x). Pomalá šunka. Takže znova to nezapínám. Pošlu jen skreenshoty.

Kod mám na linuxu, takže nemohu nyní poslat. Ale chyba zdá se být uvnitř těch kulatých závorek s podmínkou za slovem while.

Přitom to normálně funguje. memory_monitoring se spustí právě až se sníží aktivita systému.
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: k3dAR 13. 09. 2023, 22:34:08
nejak nechapu, na neco se zeptas, dostanes odpoved(i), pak po case to resis s AI kde to "vyresis" napul a prijdes se zeptat znovu v cem mas problem, misto abys zkusil ty rady ktere uz si dostal? zkusil si ten muj prepsanej kod? zkusil si tu nahradu , za .  co sem psal v EDIT ?

standard_in error ti rve bc, protoze mu porad cpes desetine cislo s carkou misto tecky...
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: exkalibr 14. 09. 2023, 10:33:05
Ano přišel jsem po delší době protože jsem nedostal žádnou zprávu. Takže jsem to řešil s AI. A kdy si nepamatuju, ale tohle je aktuální stav.

Kód: [Vybrat]
# Function is used
# by function waiting_on_system_ready_monitor_memory
DEBUG_mpstat_activity_float() {
  echo "mpstat_activity_float() idle=..."
  local idle=$(mpstat | awk 'NF >= 1 {idle += $(NF)} END {print idle}')
  echo "mpstat_activity_float() activity=..."
  local activity=$((100 - idle))
  # local activity=$(awk -v idle="$idle" 'BEGIN {print 100 - idle}')
current_activity=$(echo "scale=2; 100 - ${current_idle}" | bc)
  # Převod čísla na US locale format zajistí, že vstup
  # smyčky while uvnitř funkce
  #    waiting_on_system_ready_monitor_memory
  # nevygeneruje "syntax error"
  local activity=$(printf "%.2f\n" "$activity" | sed 's/\,/./')
  echo "$activity"
}

# Function is used
# by function waiting_on_system_ready_monitor_memory
mpstat_activity_float() {
  echo "mpstat_activity_float() idle=..."
  local idle=$(mpstat | awk 'NF >= 1 {idle += $(NF)} END {print idle}')
  echo "mpstat_activity_float() activity=..."
  local activity=$((100 - idle))
  # local activity=$(awk -v idle="$idle" 'BEGIN {print 100 - idle}')
  echo "mpstat_activity_float() printf=..."

  # Převod čísla na US locale format zajistí, že vstup
  # smyčky while uvnitř funkce
  #    waiting_on_system_ready_monitor_memory
  # nevygeneruje "syntax error"
  local activity=$(printf "%.2f\n" "$activity" | sed 's/\,/./')
  # printf "%.2f\n" "$activity"
  echo "$activity"
}

# Funkce na čekání na snížení aktivity pod určitou úroveň
# Spouští monitor_memory &
function waiting_on_system_ready_monitor_memory() {
  local target_activity=10.25
  echo "waiting_on_system_ready_monitor_memory() current_activity="
  local current_activity=$(mpstat_activity_float)
echo "calling: DEBUG_mpstat_activity_float"
  DEBUG_mpstat_activity_float

echo "I start the while loop.."
#  current_activity=$(printf "%.2f\n" "$activity" | sed 's/\,/./')
  while (( $(echo "$current_activity >= $target_activity" | bc -l) )); do
    echo "Loop started... current_activity: $current_activity"
    sleep 120  # Dvouminutové intervaly
    current_activity=$(mpstat_activity_float)
  done

# LOOP NEVER STARTED BUT ERROR PRINT:
# (standard_in) 1: Syntax error
# (standard_in) 1: Syntax error
# (standard_in) 2: Syntax error
# (standard_in) 2: Syntax error
# (standard_in) 3: Syntax error
# (standard_in) 3: Syntax error
# This was with current_activity=8.00
  echo "System activity is $current_activity below $target_activity%. Starting memory monitoring."
  monitor_memory &
}

# Spuštění funkce pro čekání na připravenost systému
waiting_on_system_ready_monitor_memory &
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: exkalibr 14. 09. 2023, 10:35:56
Funkce kterou mi dal AI byla:
Kód: [Vybrat]
  local activity=$(printf "%.2f\n" "$activity" | sed 's/\,/./')
tj. aktuální stav ~/.profile

K3dar:
Co když nepoužiju JSON? a dám tam toto:
Kód: [Vybrat]
current_activity=$(echo "scale=2; 100 - ${current_idle}" | bc)
U mě otestování trvá. Linux pouštím tak jednou za den maximálně. Už na to moc nemám nervy. Když to krachne, balím.
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: z_sk 14. 09. 2023, 11:38:19
Hľa. Ak je system vyťažený nad 70 %, tak program o tom informuje a skončí.
Kód: [Vybrat]
# Licence: CC0 1.0
while [ 1 ]; do

# actual=`LANG=C top -n 1|head -n 3|tail -n 1|awk '{print $4}'|tr -d .`
actual=`LANG=C top -n 1|awk '{if (NR == 3) print substr($4, 1, 2)substr($4, 4, 1)}'`
echo $actual
# 700 = 70%
if [ "$actual" -ge "700" ]; then
echo "System je velmi vytazeny"
break;
fi
done
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: z_sk 14. 09. 2023, 11:51:00
Hľa, ak je veľmi systém vyťažený, tak vypíše o tom info a skonči. Toto je správne. Predtým príspevok nebol správny, nakoľko nefungovalo dobreé pri vyťažení pod 10 % systému.
Kód: [Vybrat]
# Licence: CC0 1.0
while [ 1 ]; do

# actual=`LANG=C top -n 1|head -n 3|tail -n 1|awk '{print $4}'|tr -d .`
actual=`LANG=C top -n 1|awk '{if (NR == 3) {split($4, v, "."); print v[1]v[2]}}'`

# 700 = 70%
if [ "$actual" -ge "700" ]; then
echo "System je velmi vytazeny"
break;
fi
done
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: exkalibr 15. 09. 2023, 10:49:54
Ok dík. Trochu jsem se ptal AI na toto LANG=C .§
On dal příklad:
LANG=cs_CZ.utf8 printf "%f\n" 10.1001
Proč tedy používat
LANG=C
je to jako kratší?

A ten json mám použít abych tam měl ty desetinné čárky?

Protože v ladícím skriptu mám:
  echo "mpstat_activity_float() idle=..."
  local idle=$(mpstat | awk 'NF >= 1 {idle += $(NF)} END {print idle}')
  echo "mpstat_activity_float() activity=..."
  local activity=$((100 - idle))

Takže zdá se že to idle už je bez desetinné čárky. Asi se to v AWK ztratí.

AI dal ještě toto (opraveno ručně +LANG=C ):
local idle=$(LANG=C mpstat | awk 'NF >= 1 {idle += $(NF)} END {printf "%.2f", idle}')
Tak vyzkouším, je tam jen třeba dát printf na ten výstup
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: exkalibr 15. 09. 2023, 11:19:21
Zdá se že jsem to vyřešil.

Poslední chyba tedy bylo, že jsem v té funkci kde se má vrátit float dával debug hlášky echo ...

Po smazání už to je vše v cajku.

Díky


Jo a opravil jsem toto
Kód: [Vybrat]
local activity=$((100 - idle))nejdříve na toto (chyba nelze provádět aritmetickou operaci pomocí .00, chybný token ...)
Kód: [Vybrat]
local activity=$((100.00 - idle))A pak správně pomocí bc:
Kód: [Vybrat]
local activity=$(echo "100 - $idle" | bc)
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: exkalibr 15. 09. 2023, 11:21:08
Co znamená ten koment?

# Licence: CC0 1.0
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: Karmelos 15. 09. 2023, 11:40:47
Co znamená ten koment?

# Licence: CC0 1.0

Pan gůgl to ví a po zadání "Licence: CC0 1.0" to vyplodí na první dobrou... Pravděpodobně to ví i ta velmi pokročilá AI co používáte na bastlení kódu...
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: honzik1111 16. 09. 2023, 17:13:16
Linux pouštím tak jednou za den maximálně. Už na to moc nemám nervy.
Pro informaci a kontext, jedná se pořád o Linux pouštěný na Win XP vitrualizovaně s dosti omezenou pamětí?
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: Kit 16. 09. 2023, 18:13:40
Linux pouštím tak jednou za den maximálně. Už na to moc nemám nervy. Když to krachne, balím.

Linux pouštím tak jednou nebo dvakrát za měsíc. Vždy poté, co se mi nedopatřením vybijí baterky a musím ho znovu nastartovat.
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: exkalibr 17. 09. 2023, 11:50:06
Co znamená ten koment?

# Licence: CC0 1.0

Pan gůgl to ví a po zadání "Licence: CC0 1.0" to vyplodí na první dobrou... Pravděpodobně to ví i ta velmi pokročilá AI co používáte na bastlení kódu...

To je dobrý nápad, mohl jsem ten vyhledávač použít, pokud jsem nebyl na linuxu nebo neměl dostatek systémových prostředků ke spuštění LLM chatu.
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: exkalibr 17. 09. 2023, 11:51:41
Linux pouštím tak jednou za den maximálně. Už na to moc nemám nervy. Když to krachne, balím.

Linux pouštím tak jednou nebo dvakrát za měsíc. Vždy poté, co se mi nedopatřením vybijí baterky a musím ho znovu nastartovat.

Ano. Stále stejné. Ještě jsem nedořešil pár nedostatků co stále nevím jak dělat, abych našel odvahu k úplnému přechodu. To budu muset mít hodně dobrou náladu, abych se odhodlal. Promyslet rozvržení oddílů a tak, je to poměrně těžké rozhodnutí.
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: nohous 17. 09. 2023, 12:16:54
Linux pouštím tak jednou za den maximálně. Už na to moc nemám nervy. Když to krachne, balím.

Linux pouštím tak jednou nebo dvakrát za měsíc. Vždy poté, co se mi nedopatřením vybijí baterky a musím ho znovu nastartovat.

Ano. Stále stejné. Ještě jsem nedořešil pár nedostatků co stále nevím jak dělat, abych našel odvahu k úplnému přechodu. To budu muset mít hodně dobrou náladu, abych se odhodlal. Promyslet rozvržení oddílů a tak, je to poměrně těžké rozhodnutí.

Ty jsi postizenej, nebo troll?
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: Karmelos 17. 09. 2023, 16:02:30
Linux pouštím tak jednou za den maximálně. Už na to moc nemám nervy. Když to krachne, balím.

Linux pouštím tak jednou nebo dvakrát za měsíc. Vždy poté, co se mi nedopatřením vybijí baterky a musím ho znovu nastartovat.

Ano. Stále stejné. Ještě jsem nedořešil pár nedostatků co stále nevím jak dělat, abych našel odvahu k úplnému přechodu. To budu muset mít hodně dobrou náladu, abych se odhodlal. Promyslet rozvržení oddílů a tak, je to poměrně těžké rozhodnutí.

Nepotřebujete nad ničím přemýšlet. Pokud máte sata disk v tom počítači,můžete zkusit následující postup. Sám jsem ho aplikoval několikrát: Kupte si SSD s dvojnásobnou velikostí než je původní disk, a externí krabičku na disk. Nový disk vložte do krabičky, a připojte k PC. Nabootujte clonezilu z USB klíčenky a pomocí clonezily si překopírujte současný disk na ten nový v krabičce. po skončení vypněte stroj a vyměňte disky. Po zapnutí by vám měl naběhnout původní systém z nového disku. Máte zároveň funkční stroj a ultimátní kopii/zálohu původního systému. Vypněte počítač, nabootujte z usb klíčenky s instalací mintu a na volné místo nainstalujet ten váš mint. Rozdělení disku nechte na instalátoru.
Název: Re:Podmínka while nefunguje dle očekávání
Přispěvatel: z_sk 20. 09. 2023, 09:39:57
Ok dík. Trochu jsem se ptal AI na toto LANG=C .§
On dal příklad:
LANG=cs_CZ.utf8 printf "%f\n" 10.1001
Proč tedy používat
LANG=C
je to jako kratší?

A ten json mám použít abych tam měl ty desetinné čárky?

Čo viem, tak C je povinne existujúce lokalizačné prostredie pre programy v C. Jazyk je angličtina, reálne číslo je vo formáte napríklad 123456.789. Ak dáš LANG=C, tak čitateľovi signalizuje, že program je len tool (nejaký konvertor alebo iné) a nemá priamy výstup pre používateľa. Ak ale potrebuješ jazyk (napr. pre preklady správ) potom nastavuj premennú LC_ALL. Používateľ môže mať rôznu lokalizáciu, takže ak chceš správny výstup aj pri inej lokalizácie, tak si ho nastavíš na pevno (ktorý ďalej spracúvaš).

JSON je vhodný vtedy, ak spracuješ strojovo výpis. Pridávanie/odoberanie nejakého key-value páru, nemusí mať vplyv na Tvoje spracúvanie. Ale, iné umiestnenie v UI môže zmeniť Tvoje parsovanie. Čiže JSON je viac „stabilnejší“ na následne spracúvanie.