我试图在 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 ']'
清楚表明您的代码尝试比较浮点值,而[
shell 命令需要整数值。与shell相反,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"
= 将 shell 变量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
to修改print int(100-$8)
为使数字始终为整数。