感谢您在问题中提供的解决方案(以及启发我的答案 :-)),它对我很有用,即使使用多个worker(Rails 3.2.9、Ruby 1.9.3p327)也能正常工作。
我担心当我对lib进行一些更改后,可能会忘记重新启动delayed_job,在意识到这一点之前,需要花费数小时来调试。
为了允许问题中提供的代码每次启动rails时执行,但不是每次worker启动时执行,我将以下内容添加到我的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
end
puts "delayed_job ready."
我遇到的一个小问题是,它也会在例如rails generate
时被调用。我没有花太多时间寻找解决方案,但欢迎提出建议 :-)
请注意,如果您正在使用unicorn,您可能希望在before_fork
调用之前将相同的代码添加到config/unicorn.rb
中。
--编辑:
在尝试上述解决方案后,我最终采取了以下措施:
我创建了一个名为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
end
env = ARGV[1]
puts "spawing delayed job in the same env: #{env}"
system({ "RAILS_ENV" => env}, "ruby script/delayed_job start")
puts "delayed_job ready."
现在我可以随时通过以下方式引用这个文件,包括 'script/rails' 和 'config/unicorn.rb':
START_DELAYED_PATH = File.expand_path('../start_delayed_job', __FILE__)
require "#{START_DELAYED_PATH}"
START_DELAYED_PATH = File.expand_path('../../script/start_delayed_job', __FILE__)
require "#{START_DELAYED_PATH}"