保持佣金工作正常运行

时间:2009-07-15 00:42:46

标签: ruby-on-rails ruby linux bash background

我正在使用delayed_job来运行工作,每分钟都会通过cronjob添加新工作。

目前我遇到的问题是佣金工作:工作任务,目前以'nohup rake jobs:work&'开头手动,随机退出。

虽然上帝似乎是某些人的解决方案,但额外的内存开销却相当烦人,我更喜欢可以通过部署脚本(Capistrano)重新启动的更简单的解决方案。

是否有一些bash / Ruby魔法可以实现这一点,或者我注定要在我的服务器上运行一些监视服务,其中包含一些可怕的黑客攻击,以允许站点部署的无法创建的帐户重新启动它?

4 个答案:

答案 0 :(得分:0)

delayed_job文档建议您使用监视服务来管理rake worker工作。我使用runit - 效果很好。

(您可以在不替换init的模式下安装它。)

添加了:

Re:Capistrano重启:是的,runit启用了。做一个

  

sudo sv kill delayed_job

在你的Capistrano食谱中

杀死delayed_job工作者。然后,Runit将使用您新部署的代码库重新启动它。

答案 1 :(得分:0)

对我而言,守护进程的宝石与delayed_job不可靠。可能是一个编写得很糟糕的脚本(使用了集体的delayed_job github page上的那个),而不是守护进程的错误,我不太确定。但无论出于何种原因,它将在部署时不一致地重新启动。

我在某处读到这是因为它没有等待进程实际退出,所以pid文件会被覆盖或者其他东西。但我并没有真正费心去调查。我使用these instructions切换到守护进程产生的宝石,现在看起来更加可靠。

答案 2 :(得分:0)

我已经实施了小型rake任务,一遍又一遍地重新启动作业任务:

desc "Start a delayed_job worker in a endless loop to prevent exits."
task :jobs => :environment do
  while true
    begin
      Delayed::Worker.new(:min_priority => ENV['MIN_PRIORITY'], 
                          :max_priority => ENV['MAX_PRIORITY'], 
                          :quiet => false).start
    rescue Exception => e
      puts "Exception occured (#{e})"
    end
    puts "Task jobs:work exited, clearing queue and restarting"
    sleep 1
    Delayed::Job.delete_all
  end
end

显然它不起作用。所以我以这个简单的解决方案结束了:

for (( ;; )); do rake jobs:work --trace; done

答案 3 :(得分:0)

摆脱延迟的工作并使用wheneverresque