我们在重新启动或关闭序列期间使用 monit 时发现了一个问题。首先介绍一下monit的一些配置的背景。
- 监控版本是5.5
- Monit 从 inittab 启动为 null::respawn:/usr/bin/monit –Ic /etc/monitrc
- Monit 配置为每 30 秒检查一次服务。
- Monit 正在监视某些自定义应用程序,如果它们没有运行,则通过调用该特定自定义应用程序的 init 脚本来重新启动它们。
- 应用程序在 /etc/init.d/ 文件夹中有自己的初始化脚本,这些脚本在启动时启动。 Monit 在这些 init 脚本从 inittab 运行后启动。
现在解决问题:
在系统关闭/重新启动期间,首先会向 monit 发送一条命令以停止监视所有服务。此后,/etc/init.d/ 中的所有终止脚本都会被调用。在大多数情况下,它可以工作,但有一个极端的情况,即 monit 在应用程序已经正常关闭时启动应用程序,这是错误的。我试图在下面的序列图中捕获问题。
我查看了 monit 源代码,看起来当服务检查失败时,monit 尝试通过分叉并执行它来运行提到的命令。因此,当 monit 收到 unmonitor 命令时,这个分叉进程仍然可以继续进行。看起来 monit 并没有停止它在收到此命令时启动的进程并立即返回。
有没有办法等到 monit 启动的所有子进程都完成?
还有其他建议可以避免这个问题吗?