Почему это не работает, когда средняя нагрузка превышает 1?

Почему это не работает, когда средняя нагрузка превышает 1?

Я тестировалэтот сценарийи его поведение было странным. Скрипт должен генерировать уведомления всякий раз, когда средняя нагрузка превышает указанный предел.

Всякий раз, когда я передаю CPU_LOAD_LMT >=60, уведомление не генерируется, когда средняя нагрузка превышает 2 * 0,6 или 1,20 (2, поскольку моя система имеет 2 ядра, как объясняется ниже). Похоже, что со скриптом все в порядке, поскольку уведомленияявляютсягенерируется до тех пор, пока мне не исполнится 50.

CPU_LOAD_LMT умножается на количество ядер ( nprocs), а затем сравнивается со значением 100 * loadaverage.

Вот соответствующая часть кода.

   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      

Что может быть причиной?

решение1

Эта версия, которую я немного изменил, кажется, работает нормально. Я назвал ее 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

Примеры запусков

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

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

решение2

Спасибо @Gilles, я наконец увидел, что пошло не так!

В этой строке load=$CPU_LOAD_TIMEя намеревался извлечь либо $1, $2либо $3в зависимости от значения CPU_LOAD_TIME(которое будет равно 1,2 (или 5) или 3 (или 15)), заданного через параметры командной строки.

Конечно, этого не происходило. Во время первоначального тестирования я проверял только высокие нагрузки, в основном выше средней нагрузки 2,00, поэтому я этого не заметил, поскольку скрипт вел себя так, как и предполагалось (генерировал уведомления).

я сделалдва измененияи теперь скрипт срабатывает при правильных значениях (Проверено как при увеличении, так и при уменьшении нагрузки, просто чтобы убедиться). Вот основное изменение:

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

Связанный контент