如何使用Monit监控Delayed_Job

74

网上有没有用Monit监控delayed_job的示例?我查到的所有内容都是使用God,但是我拒绝使用God,因为Ruby中长时间运行的进程通常很糟糕。 (God邮件列表中最新的帖子?God内存使用率稳步增长。)

更新: delayed_job现在附带了一个示例monit配置,基于这个问题。


不确定这个方法有多好,但是可以参考一下:http://www.jacobrothstein.com/entries/delayed-job-and-monit - Joe Pym
13个回答

98

以下是我使其正常工作的方法。

  1. 使用collectiveidea fork of delayed_job,除了得到积极的维护,这个版本还有一个很好的script/delayed_job守护进程,您可以与monit一起使用。Railscasts有a good episode关于这个版本的delayed_jobASCIICasts version)。这个脚本还有一些其他不错的功能,比如运行多个worker。我在这里没有涉及那个。
  2. 安装monit。我从源代码安装,因为Ubuntu的版本太过时了。我按照these instructions的说明获取了标准的Ubuntu包中附带的init.d脚本。我还需要用./configure --sysconfdir=/etc/monit进行配置,以便选择标准的Ubuntu配置目录。
  3. 编写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指向它。

  4. 配置monit。These instructions充斥着广告,但其他方面还好。
  5. 为capistrano编写一个任务来停止和启动。monit start delayed_jobmonit stop delayed_job是您想要运行的。我在部署时还重新加载monit,以便获取任何配置文件更改。

我遇到的问题:

  1. 必须安装daemons gem才能运行script/delayed_job
  2. 您必须使用-e production(例如)将Rails环境传递给script/delayed_job。虽然此信息在README文件中有记录,但是在脚本的帮助输出中没有提到。
  3. 我使用Ruby Enterprise Edition,因此需要让monit使用该版本的Ruby启动。由于sudo在Ubuntu中处理PATH的方式,所以最终我将/usr/bin/ruby/usr/bin/gem链接到了REE版本。

调试monit时,我发现停止init.d版本并从命令行运行它有助于获取错误消息。否则很难弄清楚出了什么问题。

sudo /etc/init.d/monit stop
sudo monit start delayed_job

希望这能帮助下一个想要使用monit监控delayed_job的人。

好主意。我根据我的回答描述分叉了你的代码:http://gist.github.com/176007(你的代码没有错什么,只是我喜欢把我的监控文件放在版本控制下,这需要稍微不同的说明)。 - Luke Francl
1
我按照步骤执行了以下命令:sudo monit start delayed_job monit: 无法在 ~/.monitrc、/etc/monitrc、/usr/local/etc/monitrc、/usr/local/etc/monitrc 或 ./monitrc 中找到控制文件。但是它出现了错误!你遇到过这样的问题吗?我使用的是Ubuntu Intrepid(本地)。 - millisami
你是否使用 ./configure --sysconfdir=/etc/monit 从源代码编译了 monit?我曾经遇到过这个错误,但是设置 sysconfdir 后问题得到了解决。 - Luke Francl
10
注意:-e/--environment 选项已被弃用,不再起作用。请使用 RAILS_ENV,参见 http://github.com/collectiveidea/delayed_job/issues/#issue/7。 - fractious
很棒的提示,成功安装了最新的delayed_job版本(1.8.4,附带修改版的\contrib\delayed_job.monitrc),谢谢! - Ev Dolzhenko
显示剩余3条评论

8

就我所知,您可以始终使用 /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"

在某些情况下,您还需要使用env设置PATH。

5
我发现为Delayed Job创建一个init脚本更容易。它在这里可用:http://gist.github.com/408929 或下面的代码:
``` #! /bin/sh set_path="cd /home/rails/evatool_staging/current"
case "$1" in start) echo -n "Starting delayed_job: " su - rails -c "$set_path; RAILS_ENV=staging script/delayed_job start" >> /var/log/delayed_job.log 2>&1 echo "done." ;; stop) echo -n "Stopping sphinx: " su - rails -c "$set_path; RAILS_ENV=staging script/delayed_job stop" >> /var/log/delayed_job.log 2>&1 echo "done." ;; *) N=/etc/init.d/delayed_job_staging echo "Usage: $N {start|stop}" >&2 exit 1 ;; esac
exit 0 ```
然后确保monit设置为启动/重启应用程序,因此在您的monitrc文件中:
``` check process delayed_job with pidfile "/path_to_my_rails_app/shared/pids/delayed_job.pid" start program = "/etc/init.d/delayed_job start" stop program = "/etc/init.d/delayed_job stop" ```
这样做非常好!

5
我找到了一种很好的方式,在启动时使用cron来启动delayed_job。我正在使用whenever来控制cron。
我的schedule.rb文件:
# 自定义工作类型以控制delayed_job
job_type :delayed_job, 'cd :path;RAILS_ENV=:environment script/delayed_job ":task"'
# 启动时delayed job启动 every :reboot do delayed_job "start" end
注意:我升级了whenever gem到0.5.0版本以便使用job_type。

2
如果您的monit正在以root身份运行,并且您想要将delayed_job作为my_user运行,则需要执行以下操作:
/etc/init.d/delayed_job:
#!/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/*

2
感谢您提供脚本。
需要注意的一点是,由于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"

2

我不得不将这个页面上的解决方案与 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"

无法工作,它显示:“/bin/su: su: 必须从终端运行”。 - Lev Lukomsky

2
我不熟悉Monit,但我已经编写了几个Munin插件来监控队列大小和平均作业运行时间。我在那个补丁中对delayed_job进行的更改可能也会使你在坚持使用它时更容易编写Monit插件。

1

由于我不想以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
}

1

我在这个主题上花了相当多的时间。我对没有一个好的解决方案感到厌烦,所以我编写了delayed_job_tracer插件,专门解决监控delayed_job及其作业的问题。

这是我写的一篇文章:http://modernagility.com/articles/5-monitoring-delayed_job-and-its-jobs

此插件将监视您的延迟作业进程,并在delayed_job崩溃或其中一个作业失败时向您发送电子邮件。


你的链接带我到了一个个人资料页面,而不是一个关于延迟作业的文章。 - Sean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接