74

网上有没有关于如何使用Monit监控 delay_job 的示例?

我能找到的一切都使用God,但我拒绝使用 God ,因为 Ruby 中长时间运行的进程通常很糟糕。(大神邮件列表中最新的帖子?大神内存使用量稳步增长。)

更新: delayed_job 现在带有一个基于这个问题的示例监控配置。

4

13 回答 13

97

这是我如何工作的。

  1. 使用delayed_job 的collectiveidea 分支除了被积极维护外,这个版本还有一个很好的script/delayed_job守护进程,你可以和monit 一起使用。Railscasts 有一个关于这个版本(ASCIICasts 版本)的好插曲。该脚本还具有其他一些不错的功能,例如运行多个工作人员的能力。我在这里不做介绍。delayed_job
  2. 安装监控。我是从源代码安装的,因为 Ubuntu 的版本已经过时了。我按照这些说明获取了 Ubuntu 软件包附带的标准 init.d 脚本。我还需要配置,./configure --sysconfdir=/etc/monit因此选择了标准的 Ubuntu 配置目录。
  3. 编写监控脚本。这是我想出的:

    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"

    我将它存储在我的 soucre 控制系统中,并include /var/www/app/current/config/monit/etc/monit/monitrc文件中指向它。

  4. 配置监控。这些说明充满了广告,但其他方面都可以。
  5. 为 capistrano 编写一个停止和启动的任务。monit start delayed_job并且monit stop delayed_job是你想要运行的。部署时我还会重新加载 monit 以获取任何配置文件更改。

我遇到的问题:

  1. daemons必须安装 gem 才能script/delayed_job运行。
  2. 您必须将 Rails 环境传递给script/delayed_jobwith -e production(例如)。这记录在 README 文件中,但不在脚本的帮助输出中。
  3. 我使用的是 Ruby 企业版,所以我需要 monit 才能从该 Ruby 副本开始。由于sudo 在 Ubuntu 中处理 PATH的方式,我最终将符号链接 /usr/bin/ruby/usr/bin/gemREE 版本。

调试 monit 时,我发现停止 init.d 版本并从 th 命令行运行它会有所帮助,因此您可以获得错误消息。否则很难弄清楚为什么会出错。

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

希望这可以帮助下一个想要delayed_job使用 monit 进行监控的人。

于 2009-08-16T23:20:50.030 回答
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。

于 2009-11-12T14:55:31.280 回答
5

我发现为延迟作业创建初始化脚本更容易。可在此处获得:http: //gist.github.com/408929 或以下:

#!/bin/sh
set_path="cd /home/rails/evatool_staging/current"

案例“$1”在
  开始)
        echo -n "开始延迟作业:"
                su - rails -c "$set_path; RAILS_ENV=staging script/delayed_job start" >> /var/log/delayed_job.log 2>&1
        回声“完成”。
        ;;
  停止)
        echo -n "停止狮身人面像:"
                su - rails -c "$set_path; RAILS_ENV=staging script/delayed_job stop" >> /var/log/delayed_job.log 2>&1
        回声“完成”。
        ;;
      *)
            N=/etc/init.d/delayed_job_staging
            echo "用法:$N {start|stop}" >&2
            1号出口
            ;;
    经社理事会

    出口 0

然后确保将 monit 设置为启动/重新启动应用程序,以便在您的 monitrc 文件中:

使用pidfile“/path_to_my_rails_app/shared/pids/delayed_job.pid”检查进程delayed_job
启动程序 = "/etc/init.d/delayed_job start"
停止程序 = "/etc/init.d/delayed_job 停止"

这很好用!

于 2010-05-21T14:58:23.713 回答
5

我找到了一种在启动时使用 cron 启动 delay_job 的好方法。我正在使用任何时候来控制 cron。

我的日程安排.rb:

# 自定义作业类型来控制delayed_job
job_type :delayed_job, 'cd :path;RAILS_ENV=:environment script/delayed_job ":task"'

# 启动时延迟作业启动
每 :reboot 做
  延迟作业“开始”
结尾

注意:我将 gem 升级到 0.5.0 版本以便能够使用 job_type

于 2010-06-30T07:26:28.123 回答
2

我不知道 Monit,但我写了几个 Munin 插件来监控队列大小和平均作业运行时间。我在那个补丁中对delayed_job 所做的更改也可能使您更容易编写Monit 插件,以防您坚持使用它。

于 2009-08-04T15:44:04.780 回答
2

谢谢你的剧本。

一个问题——因为根据定义,monit 有一条“斯巴达式的道路

/bin:/usr/bin:/sbin:/usr/sbin

...对我来说,ruby 安装/链接在 /usr/local/bin 中,我不得不折腾几个小时试图弄清楚为什么在尝试重新启动 delay_job 时 monit 静默失败(即使使用 -v 表示monit详细模式) .

最后我不得不这样做:

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"
于 2009-12-05T13:46:48.547 回答
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"
于 2010-01-28T13:01:02.190 回答
2

如果您的监视器以root身份运行,并且您想以 my_user 身份运行delay_job,请执行以下操作:

/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/*
于 2016-03-08T23:00:40.743 回答
1

因为我不想以 root 身份运行,所以我最终创建了一个 bash init 脚本,用于监控启动和停止(PROGNAME 将是 script/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
}
于 2009-11-12T21:35:42.493 回答
1

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

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

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

于 2010-05-26T22:32:17.627 回答
1

对于 Rails 3,您可能需要设置 HOME env 才能使指南针正常工作,以下配置适用于我:

check process delayed_job
  with pidfile /home/user/app/shared/pids/delayed_job.pid
  start program = "/bin/sh -c 'cd /home/user/app/current; HOME=/home/user RAILS_ENV=production script/delayed_job start'"
  stop program  = "/bin/sh -c 'cd /home/user/app/current; HOME=/home/user RAILS_ENV=production script/delayed_job stop'"
于 2011-08-16T04:03:09.297 回答
0

我遇到了一个问题,如果延迟的作业在仍有作业锁定的情况下死亡,则该作业将不会被释放。我围绕延迟的工作编写了一个包装脚本,它将查看 pid 文件并从死掉的工作人员中释放任何工作。

该脚本适用于橡胶/capistrano

角色/delayedjob/delayed_job_wrapper:

<% @path = '/etc/monit/monit.d/monit-delayedjob.conf' %>
<% workers = 4 %>
<% workers.times do |i| %>
<% PIDFILE = "/mnt/custora-#{RUBBER_ENV}/shared/pids/delayed_job.#{i}.pid" %>
<%= "check process delayed_job.#{i} with pidfile #{PIDFILE}"%>
group delayed_job-<%= RUBBER_ENV %>
<%= " start program = \"/bin/bash /mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/current/script/delayed_job_wrapper #{i} start\"" %>
<%= " stop program = \"/bin/bash /mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/current/script/delayed_job_wrapper #{i} stop\"" %>
<% end %>

角色/delayedjob/delayed_job_wrapper

#!/bin/bash
<%   @path = "/mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/current/script/delayed_job_wrapper" %>

<%= "pid_file=/mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/shared/pids/delayed_job.$1.pid" %>
if [ -e $pid_file ]; then
 pid=`cat $pid_file`
 if [ $2 == "start" ]; then
   ps -e | grep ^$pid
   if [ $? -eq 0 ]; then
     echo "already running $pid"
     exit
   fi
   rm $pid_file
 fi

locked_by="delayed_job.$1 host:`hostname` pid:$pid"

<%="   /usr/bin/mysql -e \"update delayed_jobs set locked_at = null, locked_by = null where locked_by='$locked_by'\" -u#{rubber_env.db_user} -h#{rubber_instances.for_role('db', 'primary' => true).first.full_name}  #{rubber_env.db_name} " %>

fi
<%= "cd /mnt/#{rubber_env.app_name}-#{RUBBER_ENV}/current" %>

. /etc/profile
<%= "RAILS_ENV=#{RUBBER_ENV} script/delayed_job -i $1 $2"%>
于 2012-01-31T03:06:58.763 回答
0

要查看发生了什么,请在前台详细模式下运行 monit:sudo monit -Iv

使用rvm安装在用户“www1”和组“www1”下。

在文件中/etc/monit/monitrc

#delayed_job
check process delayed_job with pidfile /home/www1/your_app/current/tmp/pids/delayed_job.pid
    start program "/bin/bash -c 'PATH=$PATH:/home/www1/.rvm/bin;source /home/www1/.rvm/scripts/rvm;cd /home/www1/your_app/current;RAILS_ENV=production bundle exec script/delayed_job start'" as uid www1 and gid www1
    stop program "/bin/bash -c 'PATH=$PATH:/home/www1/.rvm/bin;source /home/www1/.rvm/scripts/rvm;cd /home/www1/your_app/current;RAILS_ENV=production bundle exec script/delayed_job stop'" as uid www1 and gid www1
    if totalmem is greater than 200 MB for 2 cycles then alert
于 2015-01-11T20:39:11.197 回答