Por que isso não funciona quando a média de carga excede 1?

Por que isso não funciona quando a média de carga excede 1?

eu tenho testadoeste roteiroe seu comportamento tem sido estranho. O script deve gerar notificações sempre que a média de carga exceder um limite especificado.

Sempre que passo um CPU_LOAD_LMT >=60, nenhuma notificação é gerada sempre que a média de carga ultrapassar 2 * 0,6 ou 1,20 (2 já que meu sistema possui 2 núcleos, explicado abaixo). Não parece haver nada de errado com o script desde as notificaçõessãogerado até eu passar de 50.

O CPU_LOAD_LMT é multiplicado pelo número de núcleos ( nprocs) e então comparado com a média de carga de 100 *.

Aqui está a parte relevante do código.

   list=`cat /proc/loadavg`
   set -- $list

   load=$CPU_LOAD_TIME #Extract required cpu load        
   load=`echo "scale=2; $load * 100" | bc` #Convert to integer
   load=`printf "%.0f" $load` #Remove decimal digits

    highload=$((`nproc`*$CPU_LOAD_LMT)) #Calculate high load threshold based on number of cores

    if test $load -ge $highload
    then

        if [ "YES" == $AUDIO ] 
        then
             paplay /usr/share/sounds/ubuntu/stereo/system-ready.ogg &
        fi

        #Generates visual notification
        if [ "YES" == $GRAPHICAL ]
        then
            notify-send -i /usr/share/icons/default.kde4/128x128/devices/cpu.png "High CPU Load"'!' \
            "The CPU has been hard at work in the past minute." #No support for timeouts. Default is 5 seconds.
        fi      

Qual seria a razão?

Responder1

Esta versão que modifiquei ligeiramente parece funcionar bem. Eu liguei para isso load.bash.

#!/bin/bash

CPU_LOAD_TIME=$1
CPU_LOAD_LMT=$2

list=$(cat /proc/loadavg)
set -- $list

load=$CPU_LOAD_TIME #Extract required cpu load
load=$(echo "scale=2; $load * 100" | bc) #Convert to integer
load=$(printf "%.0f" $load) #Remove decimal digits

highload=$((`nproc`*$CPU_LOAD_LMT)) #Calculate high load threshold 
                                    #based on number of cores

printf "LOAD: %s | HLOAD: %s\n" $load $highload
if test $load -ge $highload
then
  echo "ge"
else
  echo "le"
fi

Execuções de exemplo

$ ./load.bash 10 100
LOAD: 1000 | HLOAD: 400
ge

$ ./load.bash 1 1000
LOAD: 100 | HLOAD: 4000
le

Responder2

Obrigado a @Gilles, finalmente vi o que deu errado!

Na linha, load=$CPU_LOAD_TIMEminha intenção era extrair um de $1, $2ou $3dependendo do valor de CPU_LOAD_TIME(que seria 1,2 (ou 5) ou 3 (ou 15)) definido via parâmetros de linha de comando.

É claro que isso não estava acontecendo. Durante o teste inicial, eu estava apenas verificando cargas altas, principalmente acima da média de carga de 2,00, então não percebi isso porque o script estava se comportando conforme planejado (gerando notificações).

Eu fizduas mudançase agora o script está sendo acionado com os valores corretos (testado em cargas crescentes e decrescentes, só para ter certeza). Esta é a principal mudança:

   case $CPU_LOAD_TIME in
      15)load=$3;;
      5) load=$2;;
      *) load=$1;;
   esac

informação relacionada