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 ']' 

清楚表明您的代码尝试比较浮点值,而[shell 命令需要整数值。与shell相反,awk可以进行浮点计算。

解决该问题的一种方法是将浮点值转换为整数值,如中建议的史蒂芬·哈里斯'回答

可以通过需要更少进程的方式改进脚本。您可以将比较和命令集成greptail脚本中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测试只能比较整数。

解决此问题的一个简单方法是将您的awkto修改print int(100-$8)为使数字始终为整数。

相关内容