我正在运行 ruby 守护进程。有时我们会意外启动它的第二个实例,这会导致竞争条件。
我可以使用 Monit 检测“my_ruby_daemon”是否有多个实例正在运行吗?如果是,是否要终止多余的实例?
答案1
我不知道你是否能做到这一点monit
,但我觉得错误的解决方案这可能会带来自身的问题(特别是如果你杀死了“错误的”守护进程而发生了坏事(?))。
这正确的解决方案是让您的守护进程创建并检查锁(PID 文件非常适合此操作 - 如果mydaemon.pid
存在并且其中的 PID 处于活动状态,则拒绝启动守护进程)。
有多个 ruby lockfile gem/libraries/etc 可用(像这个)。
如果无法修改守护进程,则几乎每个 Unix 系统都带有该lockfile
命令或类似命令 - 将守护进程包装在 shell 脚本中,该脚本在尝试启动之前创建/检查锁。
如果您将锁文件放在某个地方,在重新启动时会清除它(/tmp
,,/var/run
等等),这会有所帮助,这样如果您的系统崩溃,守护进程将在其初始化脚本运行时重新启动。