Ich habe getestetdieses Skriptund sein Verhalten war merkwürdig. Das Skript sollte Benachrichtigungen generieren, wenn die durchschnittliche Auslastung einen angegebenen Grenzwert überschreitet.
Wenn ich einen CPU_LOAD_LMT >=60 übergebe, wird keine Benachrichtigung generiert, wenn die durchschnittliche Auslastung 2 * 0,6 oder 1,20 überschreitet (2, da mein System 2 Kerne hat, siehe unten). Es scheint nichts mit dem Skript nicht in Ordnung zu sein, da BenachrichtigungenSindgeneriert, bis ich 50 erreiche.
Die CPU_LOAD_LMT wird mit der Anzahl der Kerne ( nprocs
) multipliziert und dann mit 100 * durchschnittlicher Auslastung verglichen.
Hier ist der relevante Teil des Codes.
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
Was könnte der Grund sein?
Antwort1
Diese Version, die ich leicht modifiziert habe, scheint gut zu funktionieren. Ich habe sie genannt 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
Beispielausführungen
$ ./load.bash 10 100
LOAD: 1000 | HLOAD: 400
ge
$ ./load.bash 1 1000
LOAD: 100 | HLOAD: 4000
le
Antwort2
Danke an @Gilles, ich habe endlich gesehen, was schiefgelaufen ist!
In dieser Zeile load=$CPU_LOAD_TIME
wollte ich entweder oder extrahieren , $1
abhängig vom über Befehlszeilenparameter festgelegten Wert (der 1, 2 (oder 5) oder 3 (oder 15) wäre).$2
$3
CPU_LOAD_TIME
Dies geschah natürlich nicht. Während des anfänglichen Tests habe ich nur nach hohen Lasten gesucht, die meist über 2,00 durchschnittliche Last lagen. Daher habe ich dies nicht bemerkt, da sich das Skript wie vorgesehen verhielt (Benachrichtigungen generierte).
ich machtezwei Änderungenund jetzt wird das Skript bei den richtigen Werten ausgelöst (zur Sicherheit sowohl bei steigender als auch bei fallender Last getestet). Dies ist die wichtigste Änderung:
case $CPU_LOAD_TIME in
15)load=$3;;
5) load=$2;;
*) load=$1;;
esac