如何监视与monit的delayed_job的如何监视与monit的delayed_job的(How

2019-05-12 15:42发布

是否有如何监控的delayed_job与网络上的任何实例monit的 ?

一切我可以找到使用神 ,但我拒绝用神,因为在Ruby中长时间运行的进程一般吸。 (最当前的帖子在神邮件列表? 上帝内存使用率稳步增长 。)

更新:delayed_job的现在配备了一个样品的monit配置基于这一问题。

Answer 1:

这里是我得到了这个工作。

  1. 使用的delayed_job的collectiveidea叉除了正在积极维护,这个版本有一个很好的script/delayed_job你可以用monit的使用守护进程。 Railscasts具有良好的插曲有关此版本的delayed_job ( ASCIICasts版 )。 这个脚本也有其它的一些功能,如运行多个工人的能力。 我不包括在这里。
  2. 安装monit的。 我从源代码安装,因为Ubuntu的版本是如此可笑过时。 我跟着这些指示得到随之而来的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"

    我在soucre控制系统和点的monit它存储此与include /var/www/app/current/config/monit/etc/monit/monitrc文件。

  4. 配置monit的。 这些指令中充满了广告,但另有确定。
  5. 写Capistrano的任务停止和启动。 monit start delayed_jobmonit stop delayed_job是要运行什么。 部署到拿起任何配置文件更改时我也重装monit的。

问题我遇到了:

  1. daemons必须安装宝石的script/delayed_job运行。
  2. 你必须通过Rails环境到script/delayed_job-e production (例如)。 这是自述文件中而不是在脚本的帮助输出记录。
  3. 我使用Ruby企业版,所以我需要得到的monit开始使用Ruby的副本。 因为这样的须藤处理PATH在Ubuntu,我结束了符号链接/usr/bin/ruby/usr/bin/gem到REE版本。

在调试monit的,我发现它有助于停止init.d中的版本,并从日命令行运行它,这样你可以得到错误信息。 否则,就很难弄清楚为什么事情会出错。

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

希望这有助于谁想要监控的下一个人delayed_job与monit的。



Answer 2:

对于它的价值,你总是可以使用/ usr /斌/包膜与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的路径了。



Answer 3:

我发现这是更容易地创建用于延迟作业的初始化脚本。 它可以在这里找到: 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"

和伟大工程!



Answer 4:

我发现了一个很好的方式与启动cron的启动delayed_job的。 我使用的,只要控制的cron。

我schedule.rb:

# custom job type to control delayed_job
job_type :delayed_job, 'cd :path;RAILS_ENV=:environment script/delayed_job ":task"'

# delayed job start on boot
every :reboot do
  delayed_job "start"
end

注:我升级每当宝石0.5.0版本能够使用工作类型



Answer 5:

我不知道与monit的,但我已经写了一对夫妇穆宁插件监视队列大小和平均作业运行时间。 我所做的更改在补丁的delayed_job也可能使你更容易编写monit的插件,你坚持的话。



Answer 6:

感谢您的脚本。

有一个问题-因为monit的定义有一个“斯巴达路径”的

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

...对我来说是安装/在/ usr / local / bin目录链接红宝石,我只好打白条了几个小时试图monit的原因在尝试重新启动delayed_job的时候悄悄没有弄清楚(即使-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"


Answer 7:

我不得不把解决此页面上而结合剧本由托比而成,使其与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"


Answer 8:

如果你的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/*


Answer 9:

因为我不想以root身份运行,我结束了创建MONIT用于启动和停止(PROGNAME将是绝对路径脚本/ delayed_job的)一个bash初始化脚本:

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
}


Answer 10:

我花了相当多的时间在这个题目。 我受够了吧,所以我写了专门针对的delayed_job及其作业的监控delayed_job_tracer插件没有一个很好的解决方案。

这里是我写一个关于它的文章: http://modernagility.com/articles/5-monitoring-delayed_job-and-its-jobs

这个插件可以监控您的延迟的工作过程,如果delayed_job的崩溃向您发送电子邮件,或者如果它的工作之一失败。



Answer 11:

对于Rails 3中,您可能需要设定HOME包膜,使罗盘正常工作,并在下面的配置为我工作:

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


Answer 12:

我跑到那里,如果延迟工作而死亡仍然有工作锁定,该作业不会被释放的问题。 我写了一个包装脚本围绕延迟作业将着眼于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"%>


Answer 13:

看看是怎么回事,在前台详细模式下运行的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


文章来源: How to monitor delayed_job with monit