나는 테스트를 해왔다.이 스크립트이상하게 행동합니다. 스크립트는 로드 평균이 지정된 제한을 초과할 때마다 알림을 생성해야 합니다.
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 이상)만 확인했기 때문에 스크립트가 예상대로 작동했기 때문에(알림 생성) 이를 포착하지 못했습니다.
내가 그랬어두 가지 변화이제 스크립트가 올바른 값으로 실행됩니다(확인하기 위해 로드 증가 및 감소에 대해 테스트됨). 주요 변경 사항은 다음과 같습니다.
case $CPU_LOAD_TIME in
15)load=$3;;
5) load=$2;;
*) load=$1;;
esac