Monit でdelayed_jobを監視する方法の例はウェブ上にありますか?
私が見つけることができるものはすべて God を使用しますが、Rubyで長時間実行されるプロセスは一般的に吸うので、神の使用を拒否します。 神のメモリ使用量は着実に増加する 。
Update:delay_jobには、この質問に基づいて sample monit config が追加されました。
価値があるものとして、常に/ 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も設定する必要があります。
遅延ジョブの初期化スクリプトを作成する方が簡単だとわかりました。ここから入手できます: 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 "
そしてそれはうまくいきます!
起動時にcronでdelayed_jobを開始する良い方法を見つけました。 whenever を使用してcronを制御しています。
私のschedule.rb:
#delay_jobを制御するカスタムジョブタイプジョブは起動時に開始します every:reboot do delayed_job "start" end
注:job_typeを使用できるように、gemを0.5.0バージョンにアップグレードしたときはいつでも
スクリプトをありがとう。
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"
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/*
このページのソリューションを、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"
Monitについては知りませんが、キューサイズと平均ジョブ実行時間を監視するために カップルMuninプラグイン を作成しました。そのパッチでdelay_jobに加えた変更により、Monitプラグインを作成しやすくなります。
ルートとして実行したくなかったため、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
}
私はこのトピックにかなりの時間を費やしました。私はそれに対する良い解決策がないことにうんざりしていたので、delayed_jobとそのジョブの監視に特に対処するdelay_job_tracerプラグインを書きました。
ここに私が書いた記事があります: http://modernagility.com/articles/5-monitoring-delayed_job-and-its-jobs
このプラグインは、遅延ジョブプロセスを監視し、delayed_jobがクラッシュした場合、またはそのジョブの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'"
何が起こっているかを見るには、フォアグラウンド冗長モードで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
ロックされたジョブがまだある間に遅延ジョブが停止すると、そのジョブは解放されないという問題に遭遇しました。遅延ジョブのラッパースクリプトを作成し、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"%>