質問

を用いてdelayed_job(又はその他のバックグラウンド業務プロセッサ)の走行の背景にあるご変更は、起動スクリプト/boot-レベルのサーバーです。このデーモンが保証するものではありません使用している場合、プロバイダを再開サーバ(デーモンが開始されているカピストラーノのレシピでのみ実行した展開).

現在の最良の方法は、思考えることができるのdelayed_jobデーモンは常に走るので、これまで初期化子を当社のレールを適用するかどうかをチェックします、デーモンが走っています。いない場合は、その初期化を開始しまdaemon、そうでない場合はもできます。

の問題として取り扱われるため、どうしてこのDelayed_Jobデーモンが実行からスクリプト?(この起動デーモンかなり簡単に、ビットがわからないのを検出す場合には既にすることができます。-

誰でもそのアイデア?

について Bernie

の答えを下記のアドバイスをお聞かせていたら思いつきました。貼るだけでconfig/initializersとんセット:

#config/initializers/delayed_job.rb

DELAYED_JOB_PID_PATH = "#{Rails.root}/tmp/pids/delayed_job.pid"

def start_delayed_job
  Thread.new do 
    `ruby script/delayed_job start`
  end
end

def process_is_dead?
  begin
    pid = File.read(DELAYED_JOB_PID_PATH).strip
    Process.kill(0, pid.to_i)
    false
  rescue
    true
  end
end

if !File.exist?(DELAYED_JOB_PID_PATH) && process_is_dead?
  start_delayed_job
end
役に立ちましたか?

解決

デーモンPIDファイル(File.exist? ...)の存在を確認。それがあれば、それを起動し、それが他の実行していると仮定します。

他のヒント

いくつかのより多くのクリーンアップのアイデア:「開始」を必要とされていません。あなたは他の何かがうまくいかないとき、新しいプロセスを起動しないようにするために「そのようなプロセスを」救うべきではありません。条件を簡素化するレスキュー「そのようなファイルやディレクトリ」のほかます。

DELAYED_JOB_PID_PATH = "#{Rails.root}/tmp/pids/delayed_job.pid"

def start_delayed_job
  Thread.new do 
    `ruby script/delayed_job start`
  end
end

def daemon_is_running?
  pid = File.read(DELAYED_JOB_PID_PATH).strip
  Process.kill(0, pid.to_i)
  true
rescue Errno::ENOENT, Errno::ESRCH   # file or process not found
  false
end

start_delayed_job unless daemon_is_running?
あなたはより多くの1つのワーカーより開始した場合、

このコードは動作しませんことを覚えておいてください。そして、デーモン(複数可)と一緒にスポーン監視プロセススクリプト/ delayed_jobの「-m」引数をチェックします。

ありがとうございま提供されるソリューションの問題の答えを行うことこそがしいです))を動作させることができ、私にとっても複数の労働者(レール3.2.9、Ruby1.9.3p327).

で悩みが見られないというのは、たいへんかを忘れて再開delayed_job後に変更すlib例えば、私にはデバッグのための時間を実現します。

を加えた以下のマイ script/rails ファイルのためのコードの問題遂行時にまたレールがない時間作業開始

puts "cleaning up delayed job pid..."
dj_pid_path = File.expand_path('../../tmp/pids/delayed_job.pid',  __FILE__)
begin
  File.delete(dj_pid_path)
rescue Errno::ENOENT # file does not exist
end
puts "delayed_job ready."

少し欠点をしているところ向きことであるにも関わらずのものが呼び出され rails generate ります。なかった時間を過ごすの見解が示唆大歓迎です:-)

ることがありますのでご注意くだいユニコーンするための追加と同じコード config/unicorn.rbbefore_fork ます。

--編集: プレイが終わりましたら、周りの解の上した結果、以下の操作を行って、そ:

作成したファイル script/start_delayed_job.rb のコンテンツ:

puts "cleaning up delayed job pid..."
dj_pid_path = File.expand_path('../../tmp/pids/delayed_job.pid',  __FILE__)

def kill_delayed(path)
  begin
    pid = File.read(path).strip
    Process.kill(0, pid.to_i)
    false
  rescue
    true
  end
end

kill_delayed(dj_pid_path)

begin
  File.delete(dj_pid_path)
rescue Errno::ENOENT # file does not exist
end

# spawn delayed
env = ARGV[1]
puts "spawing delayed job in the same env: #{env}" 

# edited, next line has been replaced with the following on in order to ensure delayed job is running in the same environment as the one that spawned it
#Process.spawn("ruby script/delayed_job start")
system({ "RAILS_ENV" => env}, "ruby script/delayed_job start")

puts "delayed_job ready."

できるようになったこのことを必要とファイルのどこにでもいる","スクリプト/レール"と"config/ユニコーン.rb'のように:

# in top of script/rails
START_DELAYED_PATH = File.expand_path('../start_delayed_job',  __FILE__)
require "#{START_DELAYED_PATH}"

# in config/unicorn.rb, before before_fork, different expand_path
START_DELAYED_PATH = File.expand_path('../../script/start_delayed_job',  __FILE__)
require "#{START_DELAYED_PATH}"

素晴らしいではありませんが、作品

  

免責事項:私はこれが多くのために望ましいことではありません定期的な再起動を引き起こすので、素晴らしいではありませんと言います。重複するインスタンスが作成されている場合はDJの実装は、キューをロックすることができますので、単純に起動しようとすると、問題を引き起こす可能性があります。

あなたは、問題のジョブを開始するために定期的に実行cronタスクをスケジュールすることができます。ジョブがすでに実行されているときDJの扱いが無OPSとしてコマンドを起動しているので、それだけで動作します。このアプローチは、DJがホストの再起動以外の何らかの理由で死亡した場合の世話をする。

# crontab example 
0 * * * * /bin/bash -l -c 'cd /var/your-app/releases/20151207224034 && RAILS_ENV=production bundle exec script/delayed_job --queue=default -i=1 restart'
あなたはwheneverのような宝石を使用している場合は、

は、これは非常に簡単です。

every 1.hour do
  script "delayed_job --queue=default -i=1 restart"
  script "delayed_job --queue=lowpri -i=2 restart"
end
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top