로드 평균이 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 덕분에, 마침내 무엇이 잘못되었는지 확인했습니다!

이 줄에서 load=$CPU_LOAD_TIME내 의도는 명령줄 매개 변수를 통해 설정된 값 (1,2(또는 5) 또는 3(또는 15)) 에 $1따라 $2또는 중 하나를 추출하는 것이었습니다.$3CPU_LOAD_TIME

물론 이런 일은 일어나지 않았습니다. 처음 테스트하는 동안 로드 평균이 대부분 2.00을 넘는 높은 로드만 확인했기 때문에 스크립트가 의도한 대로 작동(알림 생성)하고 있었기 때문에 이를 발견하지 못했습니다.

내가 만든두 가지 변화이제 스크립트가 올바른 값에서 트리거됩니다(확인하기 위해 로드 증가 및 감소 모두에서 테스트됨). 주요 변경 사항은 다음과 같습니다.

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

관련 정보