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
에 통합할 수 있습니다 .tail
awk
나는 이 명령이 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)