CPU 사용량이 90% 이상에 도달하면 알림 보내기

CPU 사용량이 90% 이상에 도달하면 알림 보내기

CPU 사용량이 90% 이상에 도달하면 Discord 알림을 보내려고 합니다. 몇 가지를 시도했지만 15번째 줄에서 오류가 발생했습니다. 이 두 변수를 어떻게 비교해야 합니까 "$CPU_USAGE" -ge "$MAX_CPU_USAGE"? 다른 모든 것은 잘 작동합니다.

이것이 내가 받은 오류입니다.

$ sudo bash -x /home/mp/cpu_usage.sh 

[sudo] password for mp: 
 + WEBHOOK_URL=<web-hook-url> 
 + MAX_CPU_USAGE=90 
 + true 
 + ++ top -bn2 
 + ++ grep %Cpu 
++ tail -1 
++ grep -P '(....|...) id,' 
++ awk '{print 100-$8}' 
 + CPU_USAGE=60.2 
 + '[' 60.2 -ge 90 ']' 
 + /home/mp/cpu_usage.sh: line 15: [: 60.2: integer expression expected
   + sleep 30

스크립트 -

#!/bin/bash

# Set the Discord webhook URL
WEBHOOK_URL="<web-hook-url>"

# Set the maximum CPU usage threshold (in percent)
MAX_CPU_USAGE=90

while true; do
  # Get the current CPU usage
  #CPU_USAGE=$(grep 'cpu' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}')
  CPU_USAGE=$(top -bn2 | grep '%Cpu' | tail -1 | grep -P '(....|...) id,'|awk '{print 100-$8}')

  # Check if the CPU usage is above the threshold
  if [ "$CPU_USAGE" -ge "$MAX_CPU_USAGE" ] ; then
    # Construct the message to send to Discord
    MESSAGE="CPU usage is HIGH"

    # Send the message to Discord using the webhook
    curl -H "Content-Type: application/json" -X POST -d "{\"content\":\"$MESSAGE\"}" $WEBHOOK_URL
  fi

  # Sleep for half a minute before checking again
  sleep 30
done

답변1

에러 메시지

 + /home/mp/cpu_usage.sh: line 15: [: 60.2: integer expression expected

명령에서

 + '[' 60.2 -ge 90 ']' 

코드에서 부동 소수점 값을 비교하려고 시도하는 반면 [쉘 명령은 정수 값을 예상한다는 점을 분명히 하십시오. 쉘과 달리 awk부동 소수점 계산을 수행할 수 있습니다.

문제를 해결하는 한 가지 방법은 다음에서 제안한 대로 부동 소수점 값을 정수 값으로 변환하는 것입니다.스티븐 해리스'답변.

더 적은 수의 프로세스가 필요한 방식으로 스크립트를 개선할 수 있습니다. 비교 및 명령을 스크립트 grep에 통합할 수 있습니다 .tailawk

나는 이 명령이 grep -P '(....|...) id,'쓸모없다고 생각한다. 왜냐하면 앞에 공백이 항상 3~4개의 문자로 이어지기 때문이다 id,.

MAX_CPU_USAGE=90

while true; do
  # Get the current CPU usage
  
  # Check if the CPU usage is above the threshold
  if top -bn2 | awk -v "max_cpu=$MAX_CPU_USAGE" '/^%Cpu/ { idle=$8 } END { if((100-idle)>max_cpu) exit 1 }'
  then
    # Construct the message to send to Discord
    MESSAGE="CPU usage is HIGH"

    # Send the message to Discord using the webhook
    curl -H "Content-Type: application/json" -X POST -d "{\"content\":\"$MESSAGE\"}" $WEBHOOK_URL
  fi

  # Sleep for half a minute before checking again
  sleep 30
done

명령 설명 awk:

  • -v "max_cpu=$MAX_CPU_USAGE"= awk쉘 변수를 변수로 전달합니다.
  • /^%Cpu/ { idle=$8 }= 8번째 필드를 %Cpu일치하는 행의 자유 값으로 저장하고 변수는 마지막 필드로 끝납니다.
  • END { if((100-idle)>max_cpu) exit 1 }= 입력 종료 시 리미트 체크. awk값이 한계를 초과하면 코드 1로 종료하고, 그렇지 않으면 0으로 종료합니다.
  • 파이프라인의 마지막 명령의 종료 코드를 확인하세요 if.awk

답변2

문제는 CPU_USAGE내 컴퓨터의 값이 정수가 아니라는 것입니다. 예를 들어 방금 0.3그 값을 얻었습니다.

-ge테스트는 정수만 비교할 수 있습니다.

이 문제를 해결하는 간단한 방법은 숫자가 항상 정수가 되도록 을 awk수정 하는 것입니다.print int(100-$8)

관련 정보