Я тестировалэтот сценарийи его поведение было странным. Скрипт должен генерировать уведомления всякий раз, когда средняя нагрузка превышает указанный предел.
Всякий раз, когда я передаю 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