我一直在测试这个脚本它的行为很奇怪。每当平均负载超过指定限制时,脚本应生成通知。
每当我传递 CPU_LOAD_LMT >=60 时,只要负载平均值超过 2 * 0.6 或 1.20(2,因为我的系统有 2 个核心,如下所述),就不会生成通知。自从收到通知以来,脚本似乎没有任何问题是生成直到我通过 50。
CPU_LOAD_LMT 乘以核心数 ( nprocs
),然后与 100 * 负载平均值进行比较。
这是代码的相关部分。
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
的值(这将是 1,2 (或 5)或 3 (或 15))。CPU_LOAD_TIME
这当然没有发生。在最初测试时,我只检查高负载(大多超过 2.00 平均负载),因此我没有发现这一点,因为脚本的行为符合预期(生成通知)。
我做了两个变化现在脚本在正确的值处触发(在增加和减少负载上进行测试,只是为了确保)。这是主要的变化:
case $CPU_LOAD_TIME in
15)load=$3;;
5) load=$2;;
*) load=$1;;
esac