Monit でdelayed_jobを監視する方法の例はウェブ上にありますか?
私が見つけることができるものはすべてGodを使用していますが、Ruby で長時間実行されるプロセスは一般的にひどいので、私は God を使用することを拒否します。(God メーリング リストの最新の投稿は? God のメモリ使用量は着実に増加しています。)
更新: delayed_job には、この質問に基づいたサンプルmonit 構成が付属しています。
Monit でdelayed_jobを監視する方法の例はウェブ上にありますか?
私が見つけることができるものはすべてGodを使用していますが、Ruby で長時間実行されるプロセスは一般的にひどいので、私は God を使用することを拒否します。(God メーリング リストの最新の投稿は? God のメモリ使用量は着実に増加しています。)
更新: delayed_job には、この質問に基づいたサンプルmonit 構成が付属しています。
これが私がこれを機能させる方法です。
script/delayed_job
使用できる優れたデーモンがあります。Railscastsには、このバージョン(ASCIICastsバージョン)に関する良いエピソードがあります。このスクリプトには、複数のワーカーを実行する機能など、その他の優れた機能もいくつかあります。ここでは取り上げません。delayed_job
./configure --sysconfdir=/etc/monit
あったため、標準のUbuntu構成ディレクトリが選択されました。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"
私はこれをソース制御システムに保存include /var/www/app/current/config/monit
し、/etc/monit/monitrc
ファイル内で監視をポイントします。
monit start delayed_job
そしてmonit stop delayed_job
あなたが実行したいものです。また、デプロイ時にmonitをリロードして、構成ファイルの変更を取得します。私が遭遇した問題:
daemons
実行するには、gemをインストールする必要がありscript/delayed_job
ます。script/delayed_job
Rails環境をwithに渡す必要があります-e production
(たとえば)。これはREADMEファイルに記載されていますが、スクリプトのヘルプ出力には記載されていません。/usr/bin/ruby
しました。/usr/bin/gem
monitをデバッグするとき、init.dバージョンを停止し、thコマンドラインから実行するとエラーメッセージが表示されるので便利だと思いました。そうでなければ、物事がうまくいかない理由を理解することは非常に困難です。
sudo /etc/init.d/monit stop
sudo monit start delayed_job
うまくいけば、これはmonitで監視したい次の人に役立つでしょうdelayed_job
。
価値があるのは、 /usr/bin/env と monit をいつでも使用して環境をセットアップできることです。これは、environment (-e) オプションが推奨されない、delayed_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 も設定する必要があります。
起動時にcronでdelayed_jobを開始する良い方法を見つけました。私はcronを制御するためにいつでも使用しています。
私のスケジュール.rb:
# Delayed_job を制御するカスタム ジョブ タイプ job_type :delayed_job, 'cd :path;RAILS_ENV=:environment script/delayed_job ":task"' # 起動時の遅延ジョブ開始 毎回 :reboot する 遅延ジョブ「開始」 終わり
注:gemを0.5.0バージョンにアップグレードして、job_typeを使用できるようにしました
遅延ジョブの初期化スクリプトを作成する方が簡単であることがわかりました。ここから入手できます: http://gist.github.com/408929 または以下:
#! /bin/sh set_path="cd /home/rails/evatool_staging/current" ケース「$1」 始める) echo -n "delayed_job を開始しています: " 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を確認します start program = "/etc/init.d/delayed_job start" stop program = "/etc/init.d/delayed_job stop"
そしてそれはうまくいきます!
このページのソリューションを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"
Monit についてはわかりませんが、Queue Size と Average Job Run Time を監視するためのMunin プラグインをいくつか作成しました。そのパッチでdelayed_jobに加えた変更により、Monitプラグインを書きやすくなるかもしれません.
スクリプトをありがとう。
1 つの落とし穴 -- monit は定義上、次の「スパルタン パス」を 持っているため
/bin:/usr/bin:/sbin:/usr/sbin
...そして私にとっては、/ usr/local/binにルビーがインストール/リンクされていたため、delayed_jobを再起動しようとしたときにmonitがサイレントに失敗した理由を突き止めようとして、何時間もの間、大騒ぎしなければなりませんでした(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/*
私はこのトピックにかなりの時間を費やしました。良い解決策がないことにうんざりしていたので、delayed_job とそのジョブの監視に特化したdelayed_job_tracer プラグインを書きました。
これについて私が書いた記事は次のとおりです。 http://modernagility.com/articles/5-monitoring-delayed_job-and-its-jobs
このプラグインは、遅延ジョブ プロセスを監視し、delayed_job がクラッシュした場合、またはジョブの 1 つが失敗した場合に電子メールを送信します。
root として実行したくなかったので、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
}
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'"
ジョブがロックされている間に遅延ジョブが終了すると、そのジョブが解放されないという問題が発生しました。pid ファイルを確認し、デッド ワーカーからすべてのジョブを解放する遅延ジョブのラッパー スクリプトを作成しました。
スクリプトはラバー/カピストラーノ用です
ロール/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"%>