74

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

私が見つけることができるものはすべてGodを使用していますが、Ruby で長時間実行されるプロセスは一般的にひどいので、私は God を使用することを拒否します。(God メーリング リストの最新の投稿は? God のメモリ使用量は着実に増加しています。)

更新: delayed_job には、この質問に基づいたサンプルmonit 構成が付属しています。

4

13 に答える 13

97

これが私がこれを機能させる方法です。

  1. アクティブに維持されることに加えて、delayed_jobのcollectiveideaフォークを使用します。このバージョンには、 monitでscript/delayed_job使用できる優れたデーモンがあります。Railscastsには、このバージョン(ASCIICastsバージョン)に関する良いエピソードがあります。このスクリプトには、複数のワーカーを実行する機能など、その他の優れた機能もいくつかあります。ここでは取り上げません。delayed_job
  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"

    私はこれをソース制御システムに保存include /var/www/app/current/config/monitし、/etc/monit/monitrcファイル内で監視をポイントします。

  4. monitを構成します。これらの手順には広告が満載ですが、それ以外は問題ありません。
  5. capistranoが停止および開始するタスクを記述します。monit start delayed_jobそしてmonit stop delayed_jobあなたが実行したいものです。また、デプロイ時にmonitをリロードして、構成ファイルの変更を取得します。

私が遭遇した問題:

  1. daemons実行するには、gemをインストールする必要がありscript/delayed_jobます。
  2. script/delayed_jobRails環境をwithに渡す必要があります-e production(たとえば)。これはREADMEファイルに記載されていますが、スクリプトのヘルプ出力には記載されていません。
  3. 私はRubyEnterpriseEditionを使用しているので、Rubyのコピーから始めるためにmonitを入手する必要がありました。sudoがUbuntuで PATHを処理する方法のために、私は最終的にREEバージョンにシンボリックリンク/usr/bin/rubyしました。/usr/bin/gem

monitをデバッグするとき、init.dバージョンを停止し、thコマンドラインから実行するとエラーメッセージが表示されるので便利だと思いました。そうでなければ、物事がうまくいかない理由を理解することは非常に困難です。

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

うまくいけば、これはmonitで監視したい次の人に役立つでしょうdelayed_job

于 2009-08-16T23:20:50.030 に答える
8

価値があるのは、 /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 も設定する必要があります。

于 2009-11-12T14:55:31.280 に答える
5

起動時に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を使用できるようにしました

于 2010-06-30T07:26:28.123 に答える
5

遅延ジョブの初期化スクリプトを作成する方が簡単であることがわかりました。ここから入手できます: 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"

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

于 2010-05-21T14:58:23.713 に答える
2

このページのソリューションを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"
于 2010-01-28T13:01:02.190 に答える
2

Monit についてはわかりませんが、Queue Size と Average Job Run Time を監視するためのMunin プラグインをいくつか作成しました。そのパッチでdelayed_jobに加えた変更により、Monitプラグインを書きやすくなるかもしれません.

于 2009-08-04T15:44:04.780 に答える
2

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

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"
于 2009-12-05T13:46:48.547 に答える
2

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/*
于 2016-03-08T23:00:40.743 に答える
1

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

これについて私が書いた記事は次のとおりです。 http://modernagility.com/articles/5-monitoring-delayed_job-and-its-jobs

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

于 2010-05-26T22:32:17.627 に答える
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
}
于 2009-11-12T21:35:42.493 に答える
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'"
于 2011-08-16T04:03:09.297 に答える
0

ジョブがロックされている間に遅延ジョブが終了すると、そのジョブが解放されないという問題が発生しました。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"%>
于 2012-01-31T03:06:58.763 に答える