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_TIME
mi intención era extraer cualquiera de $1
, $2
o $3
dependiendo 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