前几天公司的邮件系统被内部的一个员工搞的不能收发邮件,原因是因为其在java程序中加入了告警设置。出现告警后会由公司的邮箱向他的163邮箱发送告警邮件。不想程序写的不严谨,出现了死循环。搞的不停的向163邮箱发邮件,163的反垃圾机制过滤后。所有的邮件发不出去,只能排在队列里。等发现时,发现队列里已经有15万多个在等待发送的邮件了。结果是:公司老大很生气,邮件系统出问题了都没人知道。为什么不加入nagios监控里。
老大发话了,咱也只能屁颠屁颠的去办了。本来想自己写个插件,不过有现成的为什么不用呢,先去了exchange.nagios.org里找监控postfix队列的插件。相关的插件有几个,具体可以查看页面:http://exchange.nagios.org/index.php?option=com_mtree&task=search&Itemid=74&searchword=postfix ,大致看了,都差不多。正好在搜索时从网上又发现了另外一个脚本,即监控发送内容的多少又监控队列的多少(说白了几个脚本不过是利用mailq和postqueue -p罢了)
#!/bin/bash STATE_OK=0 STATE_WARNING=1 STATE_CRITICAL=2 STATE_UNKNOWN=3 if [ "$#" == "10" ] then #Set variables arg=${10} w=$2 c=$4 W=$6 C=$8 mt="Mail queue is empty" emp=`postqueue -c /etc/$arg -p` if [ "$emp" = "$mt" ]; then echo "OK : $mt" exitstatus=$STATE_OK else crt=`postqueue -c /etc/$arg -p | grep Kbytes | sed -e 's/^.*--.//g' | awk '{print $1}'` mg=`postqueue -c /etc/$arg -p | grep Kbytes | sed -e 's/^.*--.//g' | awk '{print $4}'` #if [[ $mg > $c || $crt > $C ]] if [ "$mg" -gt "$c" -o "$crt" -gt "$C" ]; then echo "Critical : Queue has $mg messages in $crt Kbytes, higher then critical limit." exitstatus=$STATE_CRITICAL elif [ "$mg" -gt "$w" -o "$crt" -gt "$W" ] #[[ $mg < $c || $crt < $C ]] then echo "Warning : Queue has $mg messages in $crt Kbytes, higher then warning limit." exitstatus=$STATE_WARNING else echo "OK : Mail queue has $mg messages in $crt Kbytes." exitstatus=$STATE_OK fi fi else echo " " echo "Please provide parameters to work with." echo "Help : ./check_postque -w 20 -c 30 -W 1000000 -C 3000000 -p postfix" echo "Where :" echo " -w = Request Warning limit" echo " -c = Request Critical limit" echo " -W = Message size Warning limit" echo " -C = Message size Critical limit" echo " -p = Postfix instance name" echo " " fi exit $exitstatus
<br />
<p style="text-indent:2em;">
注:脚本刚拿来用时,是有问题的,我把其中出问题的部分的判断已经改好了,可以直接拿走使用。
</p>
<p style="text-indent:2em;">
接着修改邮件服务器的nrpe.cfg文件,增加如下command监控:
</p>
<p style="text-indent:2em;">
command[check_postque]=/App/nagios/libexec/check_postque -w 50-c 100 -W 3000000 -C 5000000 -p postfix #队列数大于50告警,100严重告警。邮件大小总计300M告警,邮件大小总计500M严重告警
</p>
<br />
<p style="text-indent:2em;">
注:我的nagios的程序是安装在/App/nagios目录的,如果你安装的其他目录,上面的command中的路径也需要做相应的修改,不然会出问题的。
</p>
<p style="text-indent:2em;">
然后,kill掉nrpe进程,并重新启动/App/nagios/bin/nrpe -c <span style="display:none;" id="__kindeditor_bookmark_start_218__"></span>/App/nagios/etc/nrpe.cfg <span style="display:none;" id="__kindeditor_bookmark_end_219__"></span>-d
</p>
<p style="text-indent:2em;">
在nagios中心主控端也需要添加相应的一条监控service
</p>
<p style="text-indent:2em;">
define service{ use local-service,srv-pnp host_name XXX.XX.XX.XX service_description check_postque check_command check_nrpe!check_postque }
</p>
<br />
<p style="text-indent:2em;">
我上面把自己的IP给改成了XXX,具体改成自己的就好了,use也需要nagios之前的配置改。
</p>
<p style="text-indent:2em;">
操作完成后,在主控端通过/App/nagios/bin/nagios -v /App/nagios/etc/nagios.cfg查看是不是配置文件有问题,如果没问题就可以进入/etc/init.d目前通过./nagios reload重新加载配置文件了。
</p>
<p style="text-indent:2em;">
如果有问题,也可以通过在主控端通过
</p>
<p style="text-indent:2em;">
./check_nrpe -H XXX.XX.XX.XX -c check_postque查看是不是有输出来检测nrpe通信是不是有问题。
</p>
<p style="text-indent:2em;">
我这边因为没有邮件在发送,所以得到的结果是OK : Mail queue is empty。
</p>