如何用monit监控delayed_job

在networking上有没有任何与Monit监控delayed_job的例子?

我能find的所有东西都使用上帝 ,但是我拒绝使用上帝,因为在Ruby中长时间运行的进程通常会吸引人。 (上帝的邮件列表中最新的post? 上帝的记忆使用率稳步增长 。)

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

这是我如何得到这个工作。

  1. 除了被主动维护之外,还可以使用delayed_job的collectiveidea分支 ,这个版本有一个很好的script/delayed_job守护进程,可以和monit一起使用。 Railscasts有关这个版本的delayed_job ( ASCIICasts版本 )的一个很好的插曲 。 这个脚本还有其他一些很好的function,比如能够运行多个worker。 我不在这里覆盖。
  2. 安装monit。 我从源代码安装,因为Ubuntu的版本是如此荒谬的过时。 我按照这些指示来获得Ubuntu软件包附带的标准init.d脚本。 我还需要使用./configure --sysconfdir=/etc/monit进行configuration,这样标准的Ubuntuconfiguration目录才会被提取出来。
  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"

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

  4. configuration监控。 这些说明充满了广告,但没有问题。
  5. 写一个capistrano的任务停下来,开始。 monit start delayed_jobmonit stop delayed_job是你想要运行的。 我也重新加载monit部署时,拿起任何configuration文件的变化。

我遇到的问题:

  1. daemons gem必须安装为script/delayed_job运行。
  2. 您必须将Rails环境通过-e production (例如)传递给script/delayed_job 。 这在自述文件中有logging,但不在脚本的帮助输出中。
  3. 我使用Ruby企业版,所以我需要从这个副本的Ruby开始。 由于sudo在Ubuntu中处理PATH的方式,我最终将/usr/bin/ruby/usr/bin/gem到了REE版本。

在debuggingmonit时,我发现它有助于停止init.d版本并从第n个命令行运行它,这样就可以得到错误信息。 否则,很难弄清楚为什么事情出错了。

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

希望这有助于下一个想监视delayed_job人。

对于什么是值得的,你总是可以使用/ 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。

我发现创build延迟作业的初始化脚本比较容易。 这是可用的: http : //gist.github.com/408929或以下:

 #!  / bin / sh的
 set_path =“cd / home / rails / evatool_staging / current”

在“1美元”的情况下
  开始)
        回声-n“启动delayed_job:”
                 su  -  rails -c“$ set_path; RAILS_ENV =登台脚本/ delayed_job start”>> /var/log/delayed_job.log 2>&1
        回声“完成”。
         ;;
  停止)
        回声-n“停止狮身人面像:”
                 su  -  rails -c“$ set_path; RAILS_ENV =登台脚本/ delayed_job stop”>> /var/log/delayed_job.log 2>&1
        回声“完成”。
         ;;
       *)
             N =的/ etc / init.d /的delayed_job_staging
             echo“用法:$ N {start | stop}”>&2
            出口1
             ;;
     ESAC

    退出0

然后确保monit设置为在你的monitrc文件中启动/重启应用程序:

 用pidfile检查进程delayed_job“/path_to_my_rails_app/shared/pids/delayed_job.pid”
启动程序=“/etc/init.d/delayed_job start”
 stop program =“/etc/init.d/delayed_job stop” 

那很好用!

我发现一个很好的方式来启动与cron启动delayed_job。 我用什么来控制cron。

我的schedule.rb:

 #自定义作业types来控制delayed_job
 job_type:delayed_job,'cd:path; RAILS_ENV =:环境脚本/ delayed_job“:任务”'

 #延迟作业开机启动
每一个:重新启动
   delayed_job“开始”
结束

注:我每次升级到0.5.0版本就可以使用job_type

我不知道Monit,但是我已经写了几个Munin插件来监视队列大小和平均工作时间。 我在该补丁中对delayed_job所作的更改也可能使您更容易编写Monit插件,以防止这种情况发生。

谢谢你的脚本。

一个问题 – 从定义上讲,有一个“斯巴达path”

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

…对于我来说,ruby被安装/链接到/ usr / local / bin,我不得不花费几个小时试图弄清楚为什么monit在尝试重新启动delayed_job时默默地失败(即使-v为monit verbose模式) 。

最后我必须这样做:

 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" 

如果您的monit以root用户身份运行,并且您希望以my_user的身份运行delayed_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/* 

由于我不想以root身份运行,我最终创build了一个用于启动和停止的bash初始化脚本(PROGNAME是脚本/ delayed_job的绝对path):

 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 } 

我不得不将这个页面上的解决scheme与托比(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" 

我已经花了不less时间在这个话题上。 我厌倦了没有一个好的解决scheme,所以我写了delayed_job_tracer插件,专门解决delayed_job及其工作的监测。

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

如果delayed_job崩溃或其中一个作业失败,该插件将监视您的延迟作业过程,并向您发送电子邮件。

对于Rails 3,您可能需要设置HOME env才能使罗盘正常工作,下面的configuration适用于我:

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

我遇到了一个问题,如果延迟的工作在locking工作的同时死亡,那么这个工作就不会被释放。 我写了一个关于延迟作业的封装脚本,它将查看pid文件并从死亡工作者中释放任何作业。

脚本是橡皮/ capistrano

angular色/ 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 %> 

angular色/ 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"%> 

看看是怎么回事,在前台详细模式下运行sudo monit -Ivsudo monit -Iv

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

在文件/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 
Interesting Posts