杀死 Nagiosndo2db
守护进程的正确方法是什么?
当我关机nagios
并ndo2db
执行以下操作时:
/etc/init.d/nagios stop
/etc/init.d/ndo2db stop
我看到以下内容nagios.log
:
[1311865619] 捕获 SIGTERM,正在关闭... [1311865619] 成功关机... (PID=12422) [1311865619] ndomod:关机完成。 [1311865619] 事件代理模块“/usr/local/nagios/bin/ndomod.o”已成功取消初始化。
但是/etc/init.d/ndo2db stop
向控制台输出以下消息:
ndo2db 没有运行...无法停止
如果我这样做,ps -ax | grep nagios
我仍然会看到 ndo2db 进程正在运行:
12381 ? Ss 0:00 /usr/local/nagios//bin/ndo2db -c /usr/local/nagios//etc/ndo2db.cfg
然后我必须在重新启动 ndo2db 之前手动终止它,否则我会得到:
[root@nag01 nagios]# /etc/init.d/ndo2db 启动 正在启动 ndo2db:无法绑定套接字:地址已在使用中 完毕。 [root@nag01 nagios]#
有没有更干净的方法来做到这一点?
我在跑:
- 从源代码构建的 Nagios 3.2.3
- NDO Utils 1.4b9 从源代码构建
- Centreon 2.2.1 稳定版
- Centos 5.5 x64
- MySQL 5.5 x64
更新:
我注意到的一个奇怪的事情是,当 ndo2db 和 nagios 运行时,我看到两个 ndo2db 实例:
12753?Ss 0:00 /usr/local/nagios//bin/ndo2db -c /usr/local/nagios//etc/ndo2db.cfg 12792?S 0:00 /usr/local/nagios//bin/ndo2db -c /usr/local/nagios//etc/ndo2db.cfg
这是正常的吗?如果是,那么我猜想脚本stop
的这一部分init.d
只终止了一个进程?
答案1
我找到了罪魁祸首——它是 Centreon 的配置文件生成器。
ndo2db
有一个lock_file
Centreon 配置 UI 中缺少的设置。
当 Centreon 生成配置文件时,它也会生成ndo2db.cfg
- 但没有lock_file
配置值。
关于此问题有一个未解决的问题:
在深入研究源代码后,当ndo2db
守护进程运行时,如果没有lock_file
设置,它会忽略这一点并继续运行,并且不会写入包含 PID 的锁文件。
这当然意味着stop
init 脚本中的函数将无法识别 ndo2db 进程 id,因此无法将其终止。
更新:
cfg_ndo2db
为了解决这个问题,我手动在数据库的表中添加了一个新列centreon
:
ALTER TABLE `cfg_ndo2db`
ADD COLUMN `lock_file` VARCHAR(255) NULL DEFAULT NULL;
然后我用我的 ndo2db 锁文件的路径填充它:
UPDATE `cfg_ndo2db` SET `lock_file`='/usr/local/nagios/var/ndo2db.lock' WHERE `id`=1;
这将强制 centreon 在每次生成配置时写入lock_file
设置。这似乎也能在升级后继续存在,尽管我总是检查数据库升级脚本以确保这不会作为未记录的修复程序潜入。