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

1

Eu testei este script e seu comportamento tem sido estranho. O script deve gerar notificações sempre que a média de carga exceder um limite especificado.

Sempre que eu passar uma CPU_LOAD_LMT > = 60, nenhuma notificação será gerada sempre que a média de carga exceder 2 * 0,6 ou 1,20 (2, já que meu sistema tem 2 núcleos, explicados abaixo). Não parece haver nada de errado com o script, pois as notificações são geradas até que eu passe 50.

A CPU_LOAD_LMT é multiplicada pelo número de núcleos ( nprocs ) e é então comparada com a 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 poderia ser o motivo?

    
por asheeshr 01.10.2013 / 03:32

2 respostas

0

Graças a @ Gilles , finalmente vi o que deu errado!

Na linha, load=$CPU_LOAD_TIME minha intenção era extrair $1 , $2 ou $3 dependendo do valor de CPU_LOAD_TIME (que seria 1,2 (ou 5) ou 3 ( ou 15)) definido através dos parâmetros da linha de comando.

Isso, claro, não estava acontecendo. Enquanto testava inicialmente, eu estava apenas verificando cargas altas na maioria das vezes acima da média de carga de 2,00, então não localizei isso porque o script estava se comportando conforme o pretendido (gerando notificações).

Eu fiz duas alterações e agora o script está sendo acionado nos valores corretos (testado tanto no aumento e diminuindo cargas, só para ter certeza). Esta é a principal mudança:

   case $CPU_LOAD_TIME in
      15)load=$3;;
      5) load=$2;;
      *) load=$1;;
   esac
    
por 02.10.2013 / 04:22
0

Esta versão que modifiquei parece funcionar bem. Eu chamei de 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

Exemplo é executado

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

$ ./load.bash 1 1000
LOAD: 100 | HLOAD: 4000
le
    
por 01.10.2013 / 04:08