前几天在工作中遇到了一个问题,nagios自写插件,单独测试命令和插件没有问题,但是通过check_nrpe插件调用自写插件的时候会出现问题。

下面是我写的一个插件,主要功能是:输入一个端口号,就可以知道监听该端口号的程序使用物理内存情况。

#!/bin/bashif[$#-ne1];thenecho"Usage:$0num1"exit5;fiPORT="$1"LINE=$(sudonetstat-lnutp|awk-F'[:]+''{print$5}'|grep-w${PORT}|wc-l)if[$LINE-eq1];thenPID=$(sudonetstat-lnutp|awk-F'[:]+''$5=='$PORT'{print$(NF-1)}'|awk-F'/''{print$1}')PS_NAME=$(sudonetstat-lnutp|awk-F'[:]+''$5=='$PORT'{print$(NF-1)}'|awk-F'/''{print$2}')MEM=$(ps-p${PID}-orss|grep-vRSS)MEMD=$(expr${MEM}"*"1024)echo"OKport-${PORT}${PS_NAME}usemem${MEMD}b|MEM=${MEMD}b;5000;10000;0"exit0elseecho"port-${PORT}isnotexist"exit2fi

编写该插件的时候有两个细节需要注意

1、nagios账号执行netstat命令时没有权限查看其它账号启动的程序。所以需要用sudo ,所以在/etc/sudoers添加如下内容:

nagiosALL=(ALL)NOPASSWD:/bin/netstat

使用nagios账号免密码执行/bin/netstat命令。

2、查看某个程序使用物理内存情况:

我的80端口nginx程序PID是:643

方法一:

ps-pPID-orss[root@nagios-serverlibexec]#ps-p643-orssRSS2700

方法二:

cat/proc/PID/status[root@nagios-serverlibexec]#cat/proc/643/status|grepRSSVmRSS:2700kB


测试:

我们用80端口测试:

首先我们查看80端口是否开启和监控的程序:

[root@nagios-serverlibexec]#netstat-lntp|awk-F'[:]+''$5=="80"{print}'tcp000.0.0.0:800.0.0.0:*LISTEN643/nginx

1、测试插件:

[root@nagios-serverlibexec]#shcheck_ps_mem.sh80OKport-80nginxusemem2764800b|MEM=2764800b;5000;10000;0

由以上结果可知,80端口的nginx程序使用的物理内存情况插件执行成功。

2、编辑/usr/local/nagios/etc/nrpe.cfg文件:

command[check_ps_mem]=/usr/local/nagios/libexec/check_ps_mem.sh80

3、用check_nrpe插件测试:

[root@nagios-serverlibexec]#/usr/local/nagios/libexec/check_nrpe-H127.0.0.1-ccheck_ps_memport-80isnotexist

用root账号,通过check_nrpe没有抓到数据;

4、用nagios账号执行check_nrpe测试:

[root@nagios-serverlibexec]#sudo-unagios/usr/local/nagios/libexec/check_nrpe-H127.0.0.1-ccheck_ps_memport-80isnotexist

结果:用nagios账号也是是没有抓到数据。如果nagios账号无法抓取到数据,就算添加到监控也是无法抓到数据。


问题原因:

脚本里/bin/netstat 命令是用sudo执行的。sudo无法在后端执行,执行sudo时要开启tty终端的。用check_nrpe调用脚本时,是在后端执行的sudo 。 好了,问题原因找到了。

解决方法:

在/etc/sudoers文件里添加如下内容:

Defaults:nagios!requiretty


再次测试:

添加 Defaults:nagios !requiretty 后测试:

[root@nagios-serverlibexec]#/usr/local/nagios/libexec/check_nrpe-H127.0.0.1-ccheck_ps_memOKport-80nginxusemem2764800b|MEM=2764800b;5000;10000;0[root@nagios-serverlibexec]#sudo-unagios/usr/local/nagios/libexec/check_nrpe-H127.0.0.1-ccheck_ps_memOKport-80nginxusemem2764800b|MEM=2764800b;5000;10000;0