負荷平均が 1 を超えると、なぜこれが機能しないのでしょうか?

負荷平均が 1 を超えると、なぜこれが機能しないのでしょうか?

私はテストをしてきましたこのスクリプトそして、その動作は奇妙でした。スクリプトは、負荷平均が指定された制限を超えるたびに通知を生成する必要があります。

CPU_LOAD_LMT >=60を渡すと、負荷平均が2 * 0.6または1.20(私のシステムには2つのコアがあるため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に感謝、ようやく何が悪かったのか分かりました!

この行では、コマンドラインパラメータで設定されたの値(1、2(または5)または3(または15))に応じて、または のload=$CPU_LOAD_TIMEいずれかを抽出することを意図していました。$1$2$3CPU_LOAD_TIME

もちろん、これは起こりませんでした。最初のテストでは、主に負荷平均 2.00 を超える高負荷のみをチェックしていたため、スクリプトは意図したとおりに動作していたため (通知を生成)、これに気付きませんでした。

私は作った2つの変更そして、スクリプトは正しい値でトリガーされるようになりました (念のため、負荷の増加と減少の両方でテストしました)。これが主な変更点です:

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

関連情報