如何用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
相关产品推荐
相关产品推荐

