我们已经配置了Nagios
viacheck_load
插件NRPE
来监控服务器负载,它会在负载过高时进行报告,但是没有选项可以对top
当时的顶级进程进行快照(如命令)。
有没有什么nagios
NRPE
插件可以实现这个功能?
答案1
你可以这样做事件处理器。
首先,为您的平均负载定义添加一个事件处理程序:
define service{
use generic-service
host_name xx
service_description Load_Average
check_command check_nrpe!check_load
event_handler processes_snapshot!xx
contact_groups admin-sms
}
该processes_snapshot
命令定义在commands.cfg
:
define command{
command_name processes_snapshot
command_line $USER1$/eventhandlers/processes_snapshot.sh $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$ $HOSTADDRESS$
}
其次,编写事件处理程序脚本(processes_snapshot.sh
):
#!/bin/bash
case "$1" in
OK)
;;
WARNING)
/usr/local/nagios/libexec/check_nrpe -H $4 -c processes_snapshot
;;
UNKNOWN)
;;
CRITICAL)
/usr/local/nagios/libexec/check_nrpe -H $4 -c processes_snapshot
;;
esac
exit 0
该命令在主机上processes_snapshot
定义如下:nrpe.cfg
xx
command[processes_snapshot]=top -cSbn 1 | tail -n +8 | sort -rn -k11 | head > /tmp/proc_snap.txt
PS:我还没有测试过这个配置。
答案2
以下是我获取进程列表快照的步骤直接在通知邮件中,基于 @quanta 的想法。它可能包含特定于 Nagios 在 Debian/Ubuntu 机器上安装方式的路径:
创建了一个包装脚本
/usr/local/sbin/check_load
,如果退出代码为 1(警告)或 2(严重),则调用原始脚本并附加进程快照:#!/bin/sh /usr/lib/nagios/plugins/check_load "$@" || { rc=$? echo # http://nagios.sourceforge.net/docs/3_0/pluginapi.html # | separates long output from perfdata COLUMNS=1000 top -cSbn 1|sed -e 's/|/<BAR>/g' -e 's/ \+$//' exit $rc }
这会将 COLUMNS 设置为一个大数字,这样进程名称/命令行就不会被截断为 40 个字符,以批处理模式运行 top 进行一次迭代(
-bn 1
),要求显示完整的命令行(-c
)和累积 CPU 时间( ),然后通过将其替换为来-S
确保 top 的输出不会在第一个字符处被截断。|
<BAR>
我发现 top 的默认排序顺序已经足够了——尝试按累计 CPU 时间重新排序(如 @quanta 的回答中所建议的那样)会将 init 或 crond 等系统守护进程放在顶部,这无助于我找出哪个 CGI 脚本导致了 CPU 峰值。而且这样我就可以保留 top 的标题。
别忘了
chmod +x /usr/local/sbin/check_load
编辑
/etc/nagios-plugins/config/load.cfg
并替换检查加载入口command_line /usr/lib/nagios/plugins/check_load --warning='$ARG1$,$ARG2$,$ARG3$' --critical='$ARG4$,$ARG5$,$ARG6$'
和
command_line /usr/local/sbin/check_load --warning='$ARG1$,$ARG2$,$ARG3$' --critical='$ARG4$,$ARG5$,$ARG6$'
编辑
/etc/nagios3/commands.cfg
并更新通过电子邮件通知服务条目,以便它在生成的电子邮件中包含 $LONGSERVICEOUTPUT$。它太长了,无法粘贴到这里;基本上找到该Info:\n\n$SERVICEOUTPUT$\n" | /usr/bin/mail
位并将其更改为Info:\n\n$SERVICEOUTPUT$\n$LONGSERVICEOUTPUT$\n" | /usr/bin/mail
。重新启动 nagios
service nagios3 restart
:。
我还没有尝试过用 NRPE 来实现这个功能。
答案3
我更喜欢:
command[processes_snapshot]=top -cSbn 1 | head -14 | tail -8