如何使用 monit 确保只有一个进程实例正在运行

如何使用 monit 确保只有一个进程实例正在运行

我正在运行 ruby​​ 守护进程。有时我们会意外启动它的第二个实例,这会导致竞争条件。

我可以使用 Monit 检测“my_ruby_daemon”是否有多个实例正在运行吗?如果是,是否要终止多余的实例?

答案1

我不知道你是否能做到这一点monit,但我觉得错误的解决方案这可能会带来自身的问题(特别是如果你杀死了“错误的”守护进程而发生了坏事(?))。

正确的解决方案是让您的守护进程创建并检查锁(PID 文件非常适合此操作 - 如果mydaemon.pid存在并且其中的 PID 处于活动状态,则拒绝启动守护进程)。
有多个 ruby​​ lockfile gem/libraries/etc 可用(像这个)。
如果无法修改守护进程,则几乎每个 Unix 系统都带有该lockfile命令或类似命令 - 将守护进程包装在 shell 脚本中,该脚本在尝试启动之前创建/检查锁。

如果您将锁文件放在某个地方,在重新启动时会清除它(/tmp,,/var/run等等),这会有所帮助,这样如果您的系统崩溃,守护进程将在其初始化脚本运行时重新启动。

相关内容