我查看了有关使用
monit
实用程序来监视 delayed_jobs
进程的其他问题,但没有一个真正为“现实世界”情况提供令人满意的答案。
问题是
monit
正在寻找单个 pidfile 来监视进程,如果您执行单个 delayed_job
进程,那么一切都可以正常通过 delayed_jobs
启动/停止 monit
:
# .monitrc config file
check delayed_jobs with pidfile path/to/app/tmp/pids/delayed_jobs.pid
program start = "RAILS_ENV=production script/delayed_job start"
program stop = "RAILS_ENV=production script/delayed_job stop"
但是,在任何实际应用程序中,您都会有多个在不同队列上工作的
delayed_jobs
进程。
# .monitrc config file
check delayed_jobs with pidfile path/to/app/tmp/pids/delayed_jobs.pid
program start = "RAILS_ENV=production script/delayed_job --pool=mailers:1 --pool=default:2 --pool=priority:1 start"
program stop = "RAILS_ENV=production script/delayed_job stop"
这实际上会启动 4 个独立的
delayed_jobs
进程,每个进程将在 pool
选项中列出的相应队列上工作。
这不会生成单个
path/to/app/tmp/pids/delayed_jobs.pid
文件,而是生成多个 pid 文件,每个单独的进程一个,我不知道如何让 monit
来处理它。
对于“停止”操作,我可以执行
pkill -f delayed_jobs
,这样就可以了。因此,我可以让“启动”操作生成多个进程,而“停止”操作可以杀死所有进程,但问题是 monit
将此进程标记为 does not exist
,因为它没有一个 pidfile
监控。
强力方法是为每个
monit
队列设置一个单独的 delayed_jobs
进程,如果我对单个队列有多个进程,则在它们前面加上进程索引,这样我就会有 pidfiles,例如:
delayed_jobs.priority.pid
delayed_jobs.mailers.pid
delayed_jobs.default_1.pid
delayed_jobs.default_2.pid
这“有效”,但维护起来似乎非常冗长且痛苦。
是否有更干净的方法让
monit
监控进程集合,在本例中具体为 delayed_jobs
?
简短的回答是,Monit 不支持此功能,抱歉。
是否有一种更清晰的方法让 monit 监视进程集合,在本例中特别是delayed_jobs?
“暴力”方法是启动/停止/处理作业列表中单个作业的唯一方法。