Monit监控delayed_job启动失败问题排查(RBENV环境)
搞定Monit启动delayed_job失败的问题
看起来你的Monit脚本里的启动命令写法有明显问题,这应该就是导致delayed_job.1启动失败的核心原因。我帮你拆解一下问题,再给出修复方案和排查步骤:
1. 启动命令的致命错误:环境变量与执行方式不对
你写的启动命令是:
start program = "/usr/bin RAILS_ENV=production /home/ubuntu/project_x/current/bin/delayed_job -i 1 --queues=queue_1,queue_2 start --pid-dir=/home/ubuntu/project_x/shared/pids/"
这里有两个严重问题:
/usr/bin是个目录,不是可执行命令,你把它放在开头完全没用,反而会让Monit找不到正确的执行入口。- Monit默认不会通过shell解析命令,所以直接写
RAILS_ENV=production这种环境变量赋值,Monit根本识别不了,相当于你没设置环境变量就启动delayed_job,这肯定会出问题。
修正后的启动命令应该用/bin/bash -c把整个命令包起来,让shell来处理环境变量和命令逻辑:
start program = "/bin/bash -c 'RAILS_ENV=production /home/ubuntu/project_x/current/bin/delayed_job -i 1 --queues=queue_1,queue_2 start --pid-dir=/home/ubuntu/project_x/shared/pids/'"
2. 先把stop命令补全并修正
你提供的stop命令被截断成了/home/ubuntu/project_x/current/bi...,应该是bin/delayed_job对吧?同样要按shell包裹的方式修正:
stop program = "/bin/bash -c 'RAILS_ENV=production /home/ubuntu/project_x/current/bin/delayed_job -i 1 stop'"
(一般来说,停止delayed_job不需要指定pid-dir,它会自动读取启动时生成的pid文件,除非你有特殊配置才需要加上)
3. 后续排查步骤(如果修正后还是失败)
如果改完命令还是启动不了,试试这些方法定位问题:
- 手动跑一遍启动命令:直接在服务器终端执行这条命令,看能不能正常启动,有没有报错:
手动执行的报错信息是最直接的线索,比如权限不够、依赖没装、RAILS_ENV加载失败之类的。RAILS_ENV=production /home/ubuntu/project_x/current/bin/delayed_job -i 1 --queues=queue_1,queue_2 start --pid-dir=/home/ubuntu/project_x/shared/pids/ - 检查pid目录权限:确保
/home/ubuntu/project_x/shared/pids/的所有者是Monit运行的用户(通常是root,或者你配置的用户),并且有读写权限。用ls -ld /home/ubuntu/project_x/shared/pids/就能查看,必要时用chown或chmod调整。 - 看Monit的详细日志:Monit的日志一般在
/var/log/monit.log,里面会有比“启动失败”更具体的错误,比如命令返回了非零状态、找不到文件之类的。 - 给启动命令加日志输出:可以把启动时的输出写到日志文件里,方便排查:
这样启动时的所有输出(包括错误)都会存在这个日志里,一看就明白哪里出问题。start program = "/bin/bash -c 'RAILS_ENV=production /home/ubuntu/project_x/current/bin/delayed_job -i 1 --queues=queue_1,queue_2 start --pid-dir=/home/ubuntu/project_x/shared/pids/ >> /var/log/delayed_job_1_start.log 2>&1'"
修正后的完整Monit配置示例
check process delayed_job.1 with pidfile /home/ubuntu/project_x/shared/pids/delayed_job.1.pid start program = "/bin/bash -c 'RAILS_ENV=production /home/ubuntu/project_x/current/bin/delayed_job -i 1 --queues=queue_1,queue_2 start --pid-dir=/home/ubuntu/project_x/shared/pids/'" stop program = "/bin/bash -c 'RAILS_ENV=production /home/ubuntu/project_x/current/bin/delayed_job -i 1 stop'" # 可选:加上自动重启规则 if does not exist then restart
内容的提问来源于stack exchange,提问作者SSR
相关产品推荐
相关产品推荐

