我在一台运行 CentOS 5 的服务器上安装了 Munin 和 Monit。一切运行良好,记录和报告信息,除了 httpd 进程重新启动时。我已将 Monit 设置为在内存使用量达到 2.5gb 时重新启动 httpd。如果/当发生这种情况时,它会正常重新启动,但 Monit 不会接收新进程。
我会收到一条通知,告诉我 httpd 服务不存在,然后另一条通知告诉我 httpd 启动失败,最后一条通知说 httpd 服务超时并且不再受监控。
我不确定为什么我会收到这些报告,因为 httpd 服务确实可以正常重启。我检查了日志,重启时没有出现任何问题。
答案1
也许让 monit 运行一个脚本重新启动 httpd,等待几秒钟,然后重新启动 monit。
可能是 monit 以某种方式锁定了与已终止的 httpd 进程关联的特定进程 ID - 这将允许它正确检测新进程。
我不确定当系统达到 2.5Gb 使用点时有多少可用内存,但如果该数量过低(可能是在重启期间?),Linux 将开始随机终止进程以避免完全崩溃。我猜杀毒软件可能会终止对 monit 功能至关重要的某些内容。
如果是这样的话,降低重启门槛从 2.5Gb 到 2.0Gb,或者增加盒子中的内存量会是一个更好的解决方案。
答案2
可能是竞争条件问题。Monit 的重启会生成“httpd stop”,然后是“httpd start”。这不是原子操作。“httpd stop”和“httpd start”之间的指令会交错。
“rm -rf pid file” 可能最后就完成了。Monit 将不会拾取 httpd 进程。
答案3
这是因为 Monit 太过分了。它总是无法检测服务的实际状态。我不知道为什么,但不久前我放弃了 monit,转而使用其他方式来完成 monit 尝试完成的工作,并取得了巨大的成功,并且感到非常高兴。