
テストしてきました。このスクリプト奇妙に振る舞います。スクリプトは、負荷平均が指定された制限を超えるたびに通知を生成する必要があります。
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さんありがとう、ついに何が間違っているのか確認しました!
その行の私の意図は、コマンドライン引数で設定された値(1、2(または5)、または3(または15))に基づいて、またはを抽出することload=$CPU_LOAD_TIME
です。$1
$2
$3
CPU_LOAD_TIME
もちろん、このようなことは起こりませんでした。最初のテストでは、高負荷(主に負荷平均2.00以上)のみを確認したため、スクリプトが期待どおりに機能したため(通知の生成)、これをキャッチできませんでした。
私はそうだった2つの変更スクリプトは正しい値で実行されます(確認のために負荷の増加と減少についてテスト済み)。主な変更点は次のとおりです。
case $CPU_LOAD_TIME in
15)load=$3;;
5) load=$2;;
*) load=$1;;
esac