로드 평균이 1을 초과하면 왜 작동하지 않나요?

로드 평균이 1을 초과하면 왜 작동하지 않나요?

나는 테스트를 해왔다.이 스크립트이상하게 행동합니다. 스크립트는 로드 평균이 지정된 제한을 초과할 때마다 알림을 생성해야 합니다.

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$3CPU_LOAD_TIME

물론 이런 일은 일어나지 않았습니다. 처음 테스트할 때 높은 로드(주로 로드 평균 2.00 이상)만 확인했기 때문에 스크립트가 예상대로 작동했기 때문에(알림 생성) 이를 포착하지 못했습니다.

내가 그랬어두 가지 변화이제 스크립트가 올바른 값으로 실행됩니다(확인하기 위해 로드 증가 및 감소에 대해 테스트됨). 주요 변경 사항은 다음과 같습니다.

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

관련 정보