Nagios 插件在负载高时拍摄进程快照

nit*_*ins 5 linux monitoring performance-monitoring nagios

我们已经配置Nagioscheck_loadviaNRPE插件来监控服务器负载,它会在负载高时报告,但没有选项top在那时拍摄顶级进程(如命令)的快照。

有没有nagios NRPE插件?

qua*_*nta 12

您可以使用事件处理程序来做到这一点。

首先,为您的平均负载定义添加一个事件处理程序:

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
}
Run Code Online (Sandbox Code Playgroud)

processes_snapshot命令定义在commands.cfg

define command{
    command_name    processes_snapshot
    command_line    $USER1$/eventhandlers/processes_snapshot.sh $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$ $HOSTADDRESS$
}
Run Code Online (Sandbox Code Playgroud)

其次,编写一个事件处理程序脚本 ( 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
Run Code Online (Sandbox Code Playgroud)

该命令在主机上processes_snapshot定义如下:nrpe.cfgxx

command[processes_snapshot]=top -cSbn 1 | tail -n +8 | sort -rn -k11 | head > /tmp/proc_snap.txt
Run Code Online (Sandbox Code Playgroud)

PS:我还没有测试过这个配置。

  • 这看起来像是将快照放在 /tmp 中的文件中。是否可以在 nagios 发送的通知电子邮件中获取列表? (2认同)

Mar*_*nas 8

这是我根据@quanta 的想法直接在通知电子邮件中获取进程列表快照的方法。它可能包含特定于 Nagios 在 Debian/Ubuntu 机器上安装方式的路径:

  1. /usr/local/sbin/check_load如果退出代码为 1 (WARNING) 或 2 (CRITICAL),则创建一个调用原始程序并附加进程快照的包装器脚本:

    #!/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
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这会将 COLUMNS 设置为一个很大的数字,因此进程名称/命令行不会被截断为 40 个字符,以批处理模式运行 top 进行一次迭代 ( -bn 1),要求显示完整的命令行 ( -c) 和累积 CPU 时间 ( -S) ,然后|通过将其替换为<BAR>.

    我发现 top 的默认排序顺序就足够了——尝试按累积 CPU 时间重新排序,就像@quanta 的回答中建议的那样将系统守护进程(如 init 或 crond)放在顶部,这并不能帮助我弄清楚哪个 CGI 脚本是负责 CPU 尖峰。同样这样我就可以保留顶部的标题。

    不要忘记 chmod +x /usr/local/sbin/check_load

  2. 编辑/etc/nagios-plugins/config/load.cfg并替换check_load条目

    command_line    /usr/lib/nagios/plugins/check_load --warning='$ARG1$,$ARG2$,$ARG3$' --critical='$ARG4$,$ARG5$,$ARG6$'
    
    Run Code Online (Sandbox Code Playgroud)

    command_line    /usr/local/sbin/check_load --warning='$ARG1$,$ARG2$,$ARG3$' --critical='$ARG4$,$ARG5$,$ARG6$'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 编辑/etc/nagios3/commands.cfg并更新notify-service-by-email条目,使其在生成的电子邮件中包含 $LONGSERVICEOUTPUT$。这里贴太久了;基本上找到Info:\n\n$SERVICEOUTPUT$\n" | /usr/bin/mail位并将其更改为Info:\n\n$SERVICEOUTPUT$\n$LONGSERVICEOUTPUT$\n" | /usr/bin/mail.

  4. 重启 nagios: service nagios3 restart.

我还没有用 NRPE 试过这个。