¿Por qué esto no funciona cuando el promedio de carga supera 1?

¿Por qué esto no funciona cuando el promedio de carga supera 1?

he estado probandoeste guióny su comportamiento ha sido extraño. El script debería generar notificaciones cada vez que el promedio de carga exceda un límite específico.

Cada vez que paso un CPU_LOAD_LMT >=60, no se genera ninguna notificación cada vez que el promedio de carga excede 2 * 0,6 o 1,20 (2 ya que mi sistema tiene 2 núcleos, se explica a continuación). No parece haber ningún problema con el script desde que se notificaron las notificaciones.songenerado hasta que paso 50.

CPU_LOAD_LMT se multiplica por el número de núcleos ( nprocs) y luego se compara con el promedio de carga de 100 *.

Aquí está la parte relevante del 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      

¿Cuál podría ser la razón?

Respuesta1

Esta versión que modifiqué ligeramente parece funcionar bien. Lo llamé 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

Ejecuciones de ejemplo

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

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

Respuesta2

Gracias a @Gilles¡Finalmente vi lo que salió mal!

En la línea, load=$CPU_LOAD_TIMEmi intención era extraer cualquiera de $1, $2o $3dependiendo del valor de CPU_LOAD_TIME(que sería 1,2 (o 5) o 3 (o 15)) establecido mediante parámetros de línea de comando.

Por supuesto, esto no estaba sucediendo. Mientras probaba inicialmente, solo estaba comprobando cargas altas, en su mayoría superiores a 2,00 de carga promedio, por lo que no noté esto ya que el script se comportaba según lo previsto (generando notificaciones).

hicedos cambiosy ahora el script se activa con los valores correctos (probado tanto en cargas crecientes como decrecientes, solo para estar seguro). Este es el principal cambio:

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

información relacionada