当 CPU 使用率达到 100% 时通知的 Shell 脚本

当 CPU 使用率达到 100% 时通知的 Shell 脚本

sar -u 1 | awk'{打印$9}'

所以这会每秒给我一个“CPU 空闲”值。我想在这种情况下收到电子邮件,该值连续 10 次变为“0”?

什么是适当的方法来做到这一点?

我找到了初步的解决方案

sar -u 1 | awk '{ if (int($9)==0) { 
                 i=i+1; {
                           print i, $9
                         }
                  }
       if (int($9)>=0) {
                  i=0
               }
               if (i>=10) print "sending email"
            }'

但是在最后一行我打印“发送电子邮件”的地方,我无法像这样调用 mutt

sar -u 1 | awk '{ if (int($9)==0) { 
                 i=i+1; {
                           print i, $9
                         }
                  }
       if (int($9)>=0) {
                  i=0
               }
               if (i>=10) mutt -s "VPNC Problem" [email protected] < /home/semenov/strace.output
            }'

问题是它显示 mutt 命令调用中出现“语法”错误。有什么想法吗?

答案1

正确的做法是不去做这件事。

CPU 利用率(%used 或 %idle)是一个虚假的监控值 - 在正常运行期间,它可能(也应该)在各个时间达到 100%。您是否真的想要一大堆警报,因为您的监控系统恰好在检查 CPU 利用率的同时收到了 5-10 个 Web 请求?我敢打赌答案是否定的。

相反你应该监控平均负载(由其他工具报告uptime),这是衡量现在想要运行的进程数(RunQ在操作系统调度术语中是持续时间)的指标。
该值通常报告为三个值:1 分钟平均负载(“现在”)、5 分钟平均负载和 15 分钟平均负载。


低于 1 的平均负载表示系统“未负载”(有大量空闲 CPU 时间,没有程序等待执行)。
高平均负载(“高”是指相对于您拥有的 CPU 数量和系统在负载下的交互性能而言)值得关注,应该进行调查。

我通常使用 10 作为平均负载警报的阈值 —— 这个值足够高,您通常不会在生产中看到它,但又足够低,以便您应该有时间在警报触发后对情况做出反应。


无论哪种情况,要监控的脚本都很简单:

# [get your value and stuff it into $value
# Pick an appropriate threshold and stuff it into $threshold
if [ $value -gt $threshold ]; then  # (-gt or -lt as appropriate)
    echo "`hostname` needs attention!" | \
         mail -s "`hostname` monitoring alert" user@host
fi

准备和填充部分留给读者练习。
如果你真的想做对,你应该调查一下一些监控系统和 SNMP...

答案2

好的,正确的命令是这个

sar -u 1 | awk '{ if (int($9)==0) { 
                 i=i+1; {
                           print i, $9
                         }
                  }
       if (int($9)>=0) {
                  i=0
               }
               if (i>=10) {
                      print "Sending email";
                      cmd="mutt -s  \"test\" [email protected] < /home/semenov/strace.output";
                      system(cmd)
               }
            }'

相关内容