web-dev-qa-db-ja.com

monitでdelay_jobを監視する方法

Monit でdelayed_jobを監視する方法の例はウェブ上にありますか?

私が見つけることができるものはすべて God を使用しますが、Rubyで長時間実行されるプロセスは一般的に吸うので、神の使用を拒否します。 神のメモリ使用量は着実に増加する

Update:delay_jobには、この質問に基づいて sample monit config が追加されました。

74
Luke Francl

価値があるものとして、常に/ usr/bin/envとmonitを使用して環境をセットアップできます。これは、環境(-e)オプションが廃止された現在のバージョンのdelay_job 1.8.4では特に重要です。

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も設定する必要があります。

8
mrchucho

遅延ジョブの初期化スクリプトを作成する方が簡単だとわかりました。ここから入手できます: http://Gist.github.com/408929 以下:

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

case [$ 1 "in 
 start)
 echo -n "started delay_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 "スフィンクスの停止:" 
 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 "使用法:$ N {start | stop}">&2 
 exit 1 
 ;; 
 esac 
 
 exit 0 

次に、monitcファイルでアプリを起動/再起動するようにmonitが設定されていることを確認します。

pidfile "/path_to_my_Rails_app/shared/pids/delayed_job.pid"
start program =" /etc/init.d/delayed_job start "
 stop program ="/etc/initでプロセスdelay_jobを確認します。 d/delayed_job stop "

そしてそれはうまくいきます!

5
Jason Green

起動時にcronでdelayed_jobを開始する良い方法を見つけました。 whenever を使用してcronを制御しています。

私のschedule.rb:

#delay_jobを制御するカスタムジョブタイプジョブは起動時に開始します
 every:reboot do 
 delayed_job "start" 
 end 

注:job_typeを使用できるように、gemを0.5.0バージョンにアップグレードしたときはいつでも

5
Laurynas

スクリプトをありがとう。

1つの落とし穴-定義上monitには 'spartan path' があるため

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

...そして私のためにRubyは/ usr/local/binにインストール/リンクされていました。 monit冗長モードの-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
Julian H

Monitがrootとして実行されており、delayed_jobをmy_userとして実行する場合は、次のようにします。

/ 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
Lev Lukomsky

このページのソリューションを、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"
2
xiplias

Monitについては知りませんが、キューサイズと平均ジョブ実行時間を監視するために カップルMuninプラグイン を作成しました。そのパッチでdelay_jobに加えた変更により、Monitプラグインを作成しやすくなります。

2
hsribei

ルートとして実行したくなかったため、monitが起動と停止に使用する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
}
1
Ben Marini

私はこのトピックにかなりの時間を費やしました。私はそれに対する良い解決策がないことにうんざりしていたので、delayed_jobとそのジョブの監視に特に対処するdelay_job_tracerプラグインを書きました。

ここに私が書いた記事があります: http://modernagility.com/articles/5-monitoring-delayed_job-and-its-jobs

このプラグインは、遅延ジョブプロセスを監視し、delayed_jobがクラッシュした場合、またはそのジョブの1つが失敗した場合に電子メールを送信します。

1
Kenny Johnston

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

何が起こっているかを見るには、フォアグラウンド冗長モードで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
0
kitschmaster

ロックされたジョブがまだある間に遅延ジョブが停止すると、そのジョブは解放されないという問題に遭遇しました。遅延ジョブのラッパースクリプトを作成し、pidファイルを調べて、デッドワーカーからジョブを解放します。

スクリプトはラバー/カピストラーノ用です

roles/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 %>

roles/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"%>
0
aaronjg