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