delayed_job で複数の woker を起動したい場合は
ruby script/delayed_job -n 2 start
とかそんな感じでやるのが定石みたいなんだけど、これを bluepill で監視しようとする場合は下のような pill ファイルを用意して load する必要がある。
RAILS_ROOT = File.expand_path('..', File.dirname(__FILE__))
RAILS_ENV = ENV['RAILS_ENV'] || 'production'
workers = 4
Bluepill.application("delayed_app") do |app|
workers.times do |i|
app.process("delayed_job.#{i}") do |p|
p.working_dir = RAILS_ROOT
p.environment = { "RAILS_ENV" => RAILS_ENV }
p.start_command = "./script/delayed_job start -i #{i}"
p.restart_command = "./script/delayed_job restart -i #{i}"
p.stop_command = "./script/delayed_job stop -i #{i}"
p.start_grace_time = 30.seconds
p.stop_grace_time = 30.seconds
p.restart_grace_time = 60.seconds
p.pid_file = "#{RAILS_ROOT}/tmp/pids/delayed_job.#{i}.pid"
end
end
end
具体的には -n オプションで複数の worker を立ち上げるのではなくて bluepill 側で複数の worker を管理しつつ立ち上げるようにしている。これでどのプロセスが死んだとしても bluepill が生き返らせてくれる(はず)
これは resque とかでも同じなので、似たようなことをやろうとしている人は気をつけた方がいいかもね。