Shell脚本在CP​​U使用率达到100%时通知

sar -u 1 | awk'{print $ 9}'

所以这会每秒给我“CPU空闲”值。 我想在这种情况下,电子邮件的价值连续10次“0”?

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

我find了初步的解决scheme

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命令调用中显示“语法”错误。 有任何想法吗?

做到这一点的恰当方法是不做。

CPU利用率(%使用率或%空闲率)是一个虚假的值 – 它可以(而且应该)在正常操作期间的不同时间是100%。 你真的想要一堆警报,因为在监视系统检查CPU利用率的同时,你碰巧得到了5-10个Web请求吗? 我打赌答案是否定的。

相反,您应该监视Load Average (由其他工具的uptime报告),这是衡量现在要运行的进程数量(以OS调度方式表示的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 …

好的,正确的命令是这样的

 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) } }'