【发布时间】:2011-02-04 13:40:50
【问题描述】:
我们必须使用delayed_job(或其他一些后台作业处理器)在后台运行作业,但我们不能更改服务器上的启动脚本/启动级别。这意味着如果提供程序重新启动服务器,则不能保证守护程序保持可用(因为守护程序将由每个部署仅运行一次的 capistrano 配方启动)。
目前,我能想到的确保delayed_job 守护程序始终运行的最佳方法是向我们的Rails 应用程序添加一个初始化程序,以检查该守护程序是否正在运行。如果它没有运行,则初始化程序启动守护程序,否则,它就让它继续运行。
因此,问题是我们如何检测到 Delayed_Job 守护程序正在从脚本内部运行? (我们应该能够相当容易地启动一个守护进程,有点我不知道如何检测一个是否已经处于活动状态)。
有人有什么想法吗?
问候, 伯尼
根据下面的答案,这就是我想出的。只需将其放入 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
【问题讨论】:
-
在你的回答中,我们不应该也提供
-e production吗? -
使用 rails3 这个解决方案对我不起作用。开始这个过程完全错误:它继续开始额外的工作。我回到 capistrano 任务:)
-
对于 Rails 4+,您应该在
start_delayed_job方法中将script/delayed_job替换为bin/delayed_job
标签: ruby-on-rails ruby ruby-on-rails-plugins delayed-job background-process