如何使用monit监视delayed_job


74

网络上是否有任何示例可用于监视Monit的delay_job

我能找到的所有东西都使用上帝,但我拒绝使用上帝,因为Ruby中长时间运行的进程通常很烂。(上帝邮件列表中的最新帖子?上帝记忆的使用量稳步增长。)

更新: delay_job现在带有基于此问题的示例监视配置


jacobrothstein.com/entries/delayed-job-and-monit虽然不确定它有多好,但我还没有尝试过这种方法/
Joe Pym

Answers:


97

这是我如何工作的。

  1. 除了主动维护之外,还使用delay_job的collectionidea分支,此版本有一个不错的script/delayed_job守护程序,可与monit一起使用。Railscasts对此版本(ASCIICasts version)有很好的介绍。该脚本还具有其他一些不错的功能,例如能够运行多个工作程序。我不在这里介绍。delayed_job
  2. 安装monit。我从源代码安装,因为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_jobmonit stop delayed_job这就是您要运行的。部署以拾取任何配置文件更改时,我也会重新加载monit。

我遇到的问题:

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

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

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

希望这可以帮助下一个想要监视的人delayed_job


好主意。我以您在回答中所描述的方式分叉了您:gist.github.com/176007(您的输入没有错,我只是喜欢将我的monit文件放在SCM下,需要稍有不同的说明)
Luke Francl

1
我按照以下步骤发出了命令:sudo monit start delay_job monit:在〜/ .monitrc,/ etc / monitrc,/ usr / local / etc / monitrc,/ usr / local / etc / monitrc或以下位置找不到控制文件./monitrc但是它出错了!你有没有遇到这样的问题?我在Ubuntu无畏(本地)
自学者

您是否使用来源编译了monit ./configure --sysconfdir=/etc/monit?我遇到了该错误,但是设置sysconfdir为我修复了该错误。
路加·弗朗克

10
NBThe -e/--environment option has been deprecated and has no effect. Use RAILS_ENV and see http://github.com/collectiveidea/delayed_job/issues/#issue/7
令人生畏的

伟大的提示,成功安装了最新的delay_job版本(1.8.4,它带有修改后的\ contrib \ delayed_job.monitrc),谢谢!
尔坚科

8

对于它的价值,您始终可以将/ usr / bin / env与monit一起使用来设置环境。这在当前版本的delay_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

我发现为延迟的工作创建一个初始化脚本更容易。可以在这里找到: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 =登台脚本/ delayed_job开始” >> /var/log/delayed_job.log 2>&1
        回声“完成”。
        ;;
  停)
        echo -n“停止狮身人面像:”
                su-rails -c“ $ set_path; RAILS_ENV =登台脚本/ delayed_job停止” >> /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”检查进程delay_job
启动程序=“ /etc/init.d/delayed_job start”
停止程序=“ /etc/init.d/delayed_job stop”

效果很好!


5

我找到了一种在启动时使用cron启动delay_job的好方法。我使用的,只要控制的cron。

我的schedule.rb:

#自定义作业类型来控制delay_job
job_type:delayed_job,'cd:path; RAILS_ENV =:环境脚本/ delayed_job“:task”'

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

注意:每当gem升级到0.5.0版本时,我都可以使用job_type


2

我对Monit并不了解,但是我写了几个Munin插件来监视队列大小和平均作业运行时间。我在该补丁中对delay_job所做的更改也可能使您更容易编写Monit插件,以防万一。


2

感谢您的脚本。

一个陷阱-自定义以来,monit的``斯巴达之路''

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

...而且对我来说,在/ usr / local / bin中安装/链接了ruby,我不得不花了好几个小时试图找出为什么monit在尝试重新启动delayed_job时会默默地失败(即使对于monit verbose模式也使用-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一起使用,并从合适的用户开始。

所以我的delay_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以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/*

1

由于我不想以root用户身份运行,因此我最终创建了一个bash初始化脚本,该脚本用于monit的启动和停止(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
}

1

我在这个话题上花了很多时间。我受够了没有一个好的解决方案,于是我编写了delay_job_tracer插件,专门解决了对delay_job及其作业的监视。

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

此插件将监视您的延迟作业过程,如果delay_job崩溃或其中一项作业失败,则会向您发送电子邮件。


您的链接将我带到个人资料页面,而不是有关延迟工作的文章
Sean

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'"

0

我遇到了一个问题,如果延迟的工作在仍然锁定了工作的同时死亡,那么该工作将无法释放。我围绕延迟的工作编写了一个包装器脚本,该脚本将查看pid文件并从死掉的工作人员中释放所有工作。

该脚本适用于橡胶/ Capistrano

角色/延迟工作/延迟工作包装器:

<% @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 %>

角色/延迟作业/ 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"%>

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.