You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用monit监控多个delayed_jobs进程?

如何用Monit简洁监控多队列多进程的delayed_job集合?

针对多pool启动的delayed_job进程集合监控问题,以下是几个比逐个配置更简洁的解决方案:

方案1:利用delayed_job主PID文件监控

delayed_job启动多进程时,默认会生成主进程PID文件(负责管理所有子进程),路径通常为tmp/pids/delayed_job.pid;若未自动生成,可手动指定路径。只要主进程存活,子进程意外退出时会被自动重启,因此Monit只需监控这个主PID即可覆盖所有子进程:

修改Monit配置:

check delayed_jobs_master with pidfile path/to/app/tmp/pids/delayed_job_master.pid
  program start = "RAILS_ENV=production script/delayed_job --pid-file=path/to/app/tmp/pids/delayed_job_master.pid --pool=mailers:1 --pool=default:2 --pool=priority:1 start"
  program stop = "RAILS_ENV=production script/delayed_job --pid-file=path/to/app/tmp/pids/delayed_job_master.pid stop"
  if pidfile does not exist for 1 cycle then start
  if totalmem > 600 MB for 2 cycles then alert

通过--pid-file明确指定主PID文件路径,确保Monit稳定监控主进程。

方案2:基于进程命令行匹配监控进程组

若不想依赖PID文件,可直接让Monit通过进程命令行特征匹配所有delayed_job进程,同时设置规则确保进程状态符合预期:

基础监控配置

check process delayed_jobs_group
  matching "delayed_job.*your_app_identifier"  # 替换为你的应用唯一标识,避免误匹配其他进程
  start program = "RAILS_ENV=production script/delayed_job --pool=mailers:1 --pool=default:2 --pool=priority:1 start"
  stop program = "RAILS_ENV=production script/delayed_job stop"
  if totalmem > 500 MB per process for 2 cycles then alert
  if 5 restarts within 5 cycles then timeout

matching规则会匹配所有包含指定标识的delayed_job进程,Monit会自动统计并监控这一组进程。

可选:添加进程数量校验脚本

若需要精准确保进程数等于预期(比如4个),可编写简单的检查脚本:
创建check_delayed_jobs_count.sh:

#!/bin/bash
# 预期的delayed_job进程总数
EXPECTED=4
# 统计符合条件的进程数(排除grep自身)
CURRENT=$(ps aux | grep -v grep | grep -E "delayed_job.*mailers|delayed_job.*default|delayed_job.*priority" | wc -l)

if [ "$CURRENT" -ne "$EXPECTED" ]; then
  exit 1  # 状态非0触发Monit动作
else
  exit 0
fi

给脚本添加执行权限:chmod +x check_delayed_jobs_count.sh

在Monit配置中添加:

check program delayed_jobs_count with path /path/to/check_delayed_jobs_count.sh
  every 2 cycles
  if status != 0 then restart delayed_jobs_group

当进程数不符合预期时,Monit会自动重启整个delayed_job进程组。

方案3:基于进程组ID监控

如果系统支持进程组,可通过主PID获取进程组ID,让Monit监控整个进程组:

check process delayed_jobs_group with pgid $(cat path/to/app/tmp/pids/delayed_job_master.pid)
  start program = "RAILS_ENV=production script/delayed_job --pool=mailers:1 --pool=default:2 --pool=priority:1 start"
  stop program = "RAILS_ENV=production script/delayed_job stop"
  if pgid does not exist for 1 cycle then start

该方案依赖主PID文件获取进程组ID,本质是方案1的延伸,能更直接地监控所有关联进程。

内容的提问来源于stack exchange,提问作者Dan L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:07:30