【问题标题】:How to monitor delayed_job with monit如何使用monit监控delay_job
【发布时间】:2010-11-16 14:42:28
【问题描述】:

网上有没有关于如何用Monit监控delayed_job的例子?

我能找到的所有东西都使用God,但我拒绝使用上帝,因为 Ruby 中长时间运行的进程通常很糟糕。 (上帝邮件列表中最新的帖子?God Memory Usage Grows Steadily。)

更新:根据这个问题,delayed_job 现在带有sample monit config

【问题讨论】:

标签: ruby-on-rails ruby delayed-job monit god


【解决方案1】:

如果您的监视器以 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/*

【讨论】:

    【解决方案2】:

    要查看发生了什么,请在前台详细模式下运行 monit:sudo 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
    

    【讨论】:

      【解决方案3】:

      这是我如何工作的。

      1. 使用collectiveidea fork of delayed_job 除了被积极维护外,这个版本还有一个很好的script/delayed_job 守护进程,你可以和monit 一起使用。 Railscasts 有关于这个版本的delayed_job (ASCIICasts version) 的a good episode。该脚本还具有其他一些不错的功能,例如运行多个工作人员的能力。我在这里不做介绍。
      2. 安装监控。我是从源代码安装的,因为 Ubuntu 的版本已经过时了。我跟着these instructions 获取了 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 控制系统中,并在 /etc/monit/monitrc 文件中使用 include /var/www/app/current/config/monit 对其进行监控。

      4. 配置监控。 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(例如)。这记录在自述文件中,但不在脚本的帮助输出中。
      3. 我使用的是 Ruby 企业版,因此​​我需要获取 monit 以从该 Ruby 副本开始。由于 Ubuntu 中 sudo handles the 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 的人。

      【讨论】:

      • 好主意。我按照我在回答中的描述分叉了你的:gist.github.com/176007(你的没有错或任何东西,我只是喜欢将我的监控文件放在 SCM 下,这需要稍微不同的说明)
      • 我按照步骤发出了命令: sudo monit start delay_job monit: 在~/.monitrc, /etc/monitrc, /usr/local/etc/monitrc, /usr 找不到控制文件/local/etc/monitrc 或 ./monitrc 但它出错了!。你有遇到过这样的问题吗?我在 Ubuntu Intrepid(本地)上
      • 您是否使用./configure --sysconfdir=/etc/monit 从源代码编译monit?我遇到了这个错误,但设置 sysconfdir 为我修复了它。
      • 注: The -e/--environment option has been deprecated and has no effect. Use RAILS_ENV and see http://github.com/collectiveidea/delayed_job/issues/#issue/7
      • 很好的提示,成功安装了最新的delayed_job版本(1.8.4,附带修改后的\contrib\delayed_job.monitrc),谢谢!
      【解决方案4】:

      我遇到了一个问题,如果延迟的作业在仍然锁定作业的情况下终止,该作业将不会被释放。我为延迟的作业编写了一个包装脚本,它将查看 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"%>
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          我找到了一种在启动时使用 cron 启动延迟作业的好方法。我正在使用whenever 来控制 cron。

          我的日程安排.rb:

          # 自定义作业类型来控制delayed_job job_type :delayed_job, 'cd :path;RAILS_ENV=:environment script/delayed_job ":task"' # 启动时延迟作业启动 每 :reboot 做 延迟作业“开始” 结尾

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

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

            • 您的链接将我带到个人资料页面,而不是关于延迟工作的文章
            【解决方案8】:

            我发现为延迟作业创建初始化脚本更容易。可在此处获得: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"
            stop program = "/etc/init.d/delayed_job stop"

            效果很好!

            【讨论】:

              【解决方案9】:

              我必须将此页面上的解决方案与 toby 制作的另一个 script 结合起来,以使其与 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: must be run from a terminal”
              【解决方案10】:

              感谢脚本。

              一个陷阱——因为根据定义,monit 有一个'spartan path'

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

              ... 对我来说,ruby 安装/链接在 /usr/local/bin 中,我不得不折腾几个小时试图弄清楚为什么在尝试重新启动 delay_job 时 monit 静默失败(即使使用 -v for 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"
              

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                  【解决方案12】:

                  不管怎样,你总是可以使用 /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。

                  【讨论】:

                    【解决方案13】:

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-09-18
                      • 2017-02-19
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多