2015年(68)
分类: 系统运维
2015-08-31 19:34:55
最近在nagios上新添加了一台主机的资源、服务监控,重启后过了段时间发现新增的服务监控不能更新状态,
如上图,新增的为mus01-1.9,可以看到最后的检测时间的日期都是昨天添加监控的日期,之后的状态就一直没变过。
查nagios日志,发现有这样的一条:
Aug 20 15:54:55 imusic-mon nagios: Warning: Check result queue contained results for service 'SYS_Disk /' on host 'sh-bill-mus01-1.9',
but the service could not be found! Perhaps you forgot to define the service in your config files?
字面上的意思大概是对1.9的服务(磁盘)检测结果有在检测结果队列里,但是找不到服务名,可能是此服务名没有在配置文件里定义。
接着检查配置文件,服务名“SYS_Disk /”是存在的,这是什么情况呢?折腾了一段时间,突然想起以前碰到过在naigos的webUI上执行命令无效的问题,那次是因为nagios有多个进程引起,这次会不会也是这个引起的呢?ps 一下,果然发现有三个nagios进程,全部kill掉再重启,过一段时间后再检测,发现服务监控的状态信息已经更新,问题解决。
原因分析:
(1)先来分析nagios为什么会有多个进程
我看下了naigos的启动脚本/etc/init.d/nagios,觉得这个应该是重启时旧的naigos没有正常关闭造成。重启所用的命令是/etc/init.d/nagios restart,从脚本来看,restart是先stop然后再start的:
-------
$0 stop
$0 start
-------
主要看看stop:
-----------------------
stop)
echo -n "Stopping nagios: "
pid_nagios
killproc_nagios nagios
# now we have to wait for nagios to exit and remove its
# own NagiosRunFile, otherwise a following "start" could
# happen, and then the exiting nagios will remove the
# new NagiosRunFile, allowing multiple nagios daemons
# to (sooner or later) run - John Sellens
#echo -n 'Waiting for nagios to exit .'
for i in 1 2 3 4 5 6 7 8 9 10 ; do
if status_nagios > /dev/null; then
echo -n '.'
sleep 1
else
break
fi
done
if status_nagios > /dev/null; then
echo ''
echo 'Warning - nagios did not exit in a timely manner'
else
echo 'done.'
fi
rm -f $NagiosStatusFile $NagiosRunFile $NagiosLockDir/$NagiosLockFile $NagiosCommandFile
;;
-----------------------
注释里面就可以看到,nagios是允计多个进程运行的,如果stop时nagios在指定的时间内(10秒)没有正常退出,那么正在执行退出操作的nagios就会删除之前启动用产生的运行文件、状态文件、命令文件等,然后再启动一个新nagios进程,生成新的运行文件、状态文件、命令文件等,这个时间就存在多个nagios进程了。
(2)分析错误日志产生的原因
错误日志
Aug 20 15:54:55 imusic-mon nagios: Warning: Check result queue contained results for service 'SYS_Disk /' on host 'sh-bill-mus01-1.9',
but the service could not be found! Perhaps you forgot to define the service in your config files?
这个日志产生的原因我觉得是这样子的,这个执行服务检测操作的应该是旧的nagios进程,也就是没有正常退出的那个nagios进程,因为旧的nagios进程在启动时加载的那份配置文件里没有我新添加的服务,那么就会报上面的这样错,说“此服务名没有在配置文件里定义了”。
(3)监控状态的信息没有更新
这个应该是检测结果没有写到状态文件引起的,为什么结果没有写进状文件?
是上面的(2)所引起
用旧nagios进程检测试,由于旧nagios进程所对应的状态文件在关闭进程时已经删除,自然也就写不进去了
最后提醒下自已,配置文件有改动,比如添加新主机、服务之类的,用/etc/init.d/nagios reload就行了,尽量别用restart