Спасибо за решение, предоставленное в вопросе (и ответ, который вдохновил его :-)), он работает для меня, даже с несколькими работниками (Rails 3.2.9, Ruby 1.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
call.
- РЕДАКТИРОВАНИЕ: Поработав с приведенными выше решениями, я сделал следующее:
Я создал файл 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."
Теперь я могу требовать этот файл где угодно, включая «script / rails» и «config / unicorn.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}"