開始を遅延ジョブ実行に対応したアプリケーション/サーバが再起動
-
24-09-2019 - |
質問
を用いて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.rb
前 before_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