Podmínka while nefunguje dle očekávání

Podmínka while nefunguje dle očekávání
« kdy: 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 &
« Poslední změna: 30. 08. 2023, 15:48:40 od Petr Krčmář »


Re:Podmínka while nefunguje dle očekávání
« Odpověď #1 kdy: 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:~$

Re:Podmínka while nefunguje dle očekávání
« Odpověď #2 kdy: 30. 08. 2023, 16:16:28 »
Mas z toho spusteni kompletni log ? Zkus misto bc dat plnou cestu k bc ;-)

« Poslední změna: 30. 08. 2023, 16:18:20 od Sam Samovic »

Re:Podmínka while nefunguje dle očekávání
« Odpověď #3 kdy: 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
« Poslední změna: 31. 08. 2023, 17:48:50 od exkalibr »

Re:Podmínka while nefunguje dle očekávání
« Odpověď #4 kdy: 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.


desetiná čárka je jádro pudla `bc`
« Odpověď #5 kdy: 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
« Poslední změna: 02. 09. 2023, 20:54:05 od mikesznovu »

k3dAR

  • *****
  • 3 009
  • porad nemam telo, ale uz mam hlavu... nobody
    • Zobrazit profil
    • E-mail
Re:Podmínka while nefunguje dle očekávání
« Odpověď #6 kdy: 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
« Poslední změna: 02. 09. 2023, 23:02:43 od k3dAR »

a234

Re:Podmínka while nefunguje dle očekávání
« Odpověď #7 kdy: 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.

z_sk

Re:Podmínka while nefunguje dle očekávání
« Odpověď #8 kdy: 03. 09. 2023, 23:56:06 »
Správne má byť:
Kód: [Vybrat]
LANG=C printf "%.2f\n" "$activity"

k3dAR

  • *****
  • 3 009
  • porad nemam telo, ale uz mam hlavu... nobody
    • Zobrazit profil
    • E-mail
Re:Podmínka while nefunguje dle očekávání
« Odpověď #9 kdy: 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 :-)

Re:Podmínka while nefunguje dle očekávání
« Odpověď #10 kdy: 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.

k3dAR

  • *****
  • 3 009
  • porad nemam telo, ale uz mam hlavu... nobody
    • Zobrazit profil
    • E-mail
Re:Podmínka while nefunguje dle očekávání
« Odpověď #11 kdy: 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...

Re:Podmínka while nefunguje dle očekávání
« Odpověď #12 kdy: 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 &

Re:Podmínka while nefunguje dle očekávání
« Odpověď #13 kdy: 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.
« Poslední změna: 14. 09. 2023, 10:37:45 od exkalibr »

z_sk

Re:Podmínka while nefunguje dle očekávání
« Odpověď #14 kdy: 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