网上有没有用Monit监控delayed_job的示例?我查到的所有内容都是使用God,但是我拒绝使用God,因为Ruby中长时间运行的进程通常很糟糕。 (God邮件列表中最新的帖子?God内存使用率稳步增长。)
更新: delayed_job现在附带了一个示例monit配置,基于这个问题。
网上有没有用Monit监控delayed_job的示例?我查到的所有内容都是使用God,但是我拒绝使用God,因为Ruby中长时间运行的进程通常很糟糕。 (God邮件列表中最新的帖子?God内存使用率稳步增长。)
更新: delayed_job现在附带了一个示例monit配置,基于这个问题。
以下是我使其正常工作的方法。
script/delayed_job
守护进程,您可以与monit一起使用。Railscasts有a good episode关于这个版本的delayed_job
(ASCIICasts version)。这个脚本还有一些其他不错的功能,比如运行多个worker。我在这里没有涉及那个。./configure --sysconfdir=/etc/monit
进行配置,以便选择标准的Ubuntu配置目录。编写monit脚本。这是我想出来的:
check process delayed_job with pidfile /var/www/app/shared/pids/delayed_job.pid
start program = "/var/www/app/current/script/delayed_job -e production start"
stop program = "/var/www/app/current/script/delayed_job -e production stop"
我将其存储在我的源代码控制系统中,并在/etc/monit/monitrc
文件中使用include /var/www/app/current/config/monit
指向它。
monit start delayed_job
和monit stop delayed_job
是您想要运行的。我在部署时还重新加载monit,以便获取任何配置文件更改。我遇到的问题:
daemons
gem才能运行script/delayed_job
。-e production
(例如)将Rails环境传递给script/delayed_job
。虽然此信息在README文件中有记录,但是在脚本的帮助输出中没有提到。/usr/bin/ruby
和/usr/bin/gem
链接到了REE版本。调试monit时,我发现停止init.d版本并从命令行运行它有助于获取错误消息。否则很难弄清楚出了什么问题。
sudo /etc/init.d/monit stop
sudo monit start delayed_job
delayed_job
的人。./configure --sysconfdir=/etc/monit
从源代码编译了 monit?我曾经遇到过这个错误,但是设置 sysconfdir 后问题得到了解决。 - Luke Francl-e/--environment
选项已被弃用,不再起作用。请使用 RAILS_ENV
,参见 http://github.com/collectiveidea/delayed_job/issues/#issue/7。 - fractious就我所知,您可以始终使用 /usr/bin/env 与 monit 来设置环境。在当前版本的 delayed_job(1.8.4)中,环境(-e)选项已被弃用,因此这一点尤为重要。
check process delayed_job with pidfile /var/app/shared/pids/delayed_job.pid
start program = "/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job start"
stop program = "/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job stop"
# 自定义工作类型以控制delayed_job job_type :delayed_job, 'cd :path;RAILS_ENV=:environment script/delayed_job ":task"'注意:我升级了whenever gem到0.5.0版本以便使用job_type。
# 启动时delayed job启动 every :reboot do delayed_job "start" end
#!/bin/sh
# chmod 755 /etc/init.d/delayed_job
# chown root:root /etc/init.d/delayed_job
case "$1" in
start|stop|restart)
DJ_CMD=$1
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit
esac
su -c "cd /var/www/my_app/current && /usr/bin/env bin/delayed_job $DJ_CMD" - my_user
/var/www/my_app/shared/monit/delayed_job.monitrc:
check process delayed_job with pidfile /var/www/my_app/shared/tmp/pids/delayed_job.pid
start program = "/etc/init.d/delayed_job start"
stop program = "/etc/init.d/delayed_job stop"
if 5 restarts within 5 cycles then timeout
/etc/monit/monitrc:
# add at bottom
include /var/www/my_app/shared/monit/*
/bin:/usr/bin:/sbin:/usr/sbin
... 对我来说,Ruby已经安装/链接在/usr/local/bin中,我花了几个小时的时间尝试着弄清楚为什么monit在尝试重新启动delayed_job时会默默失败(即使在monit详细模式下使用-v参数)。
最终我不得不这样做:
check process delayed_job with pidfile /var/www/app/shared/pids/delayed_job.pid
start program = "/usr/bin/env PATH=$PATH:/usr/local/bin /var/www/app/current/script/delayed_job -e production start"
stop program = "/usr/bin/env PATH=$PATH:/usr/local/bin /var/www/app/current/script/delayed_job -e production stop"
我不得不将这个页面上的解决方案与 toby 制作的另一个 脚本 结合起来,以便使其能够在 monit 上运行,并以正确的用户身份启动。
因此,我的 delayed_job.monitrc 文件如下:
check process delayed_job
with pidfile /var/app/shared/pids/delayed_job.pid
start program = "/bin/su -c '/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job start' - rails"
stop program = "/bin/su -c '/usr/bin/env RAILS_ENV=production /var/app/current/script/delayed_job stop' - rails"
由于我不想以root身份运行,所以最终我创建了一个bash init脚本,monit用于启动和停止(PROGNAME将是脚本/delayed_job的绝对路径):
start() {
echo "Starting $PROGNAME"
sudo -u $USER /usr/bin/env HOME=$HOME RAILS_ENV=$RAILS_ENV $PROGNAME start
}
stop() {
echo "Stopping $PROGNAME"
sudo -u $USER /usr/bin/env HOME=$HOME RAILS_ENV=$RAILS_ENV $PROGNAME stop
}
我在这个主题上花了相当多的时间。我对没有一个好的解决方案感到厌烦,所以我编写了delayed_job_tracer插件,专门解决监控delayed_job及其作业的问题。
这是我写的一篇文章:http://modernagility.com/articles/5-monitoring-delayed_job-and-its-jobs
此插件将监视您的延迟作业进程,并在delayed_job崩溃或其中一个作业失败时向您发送电子邮件。