我正在使用delayed_job
来运行工作,每分钟都会通过cronjob添加新工作。
目前我遇到的问题是佣金工作:工作任务,目前以'nohup rake jobs:work&'开头手动,随机退出。
虽然上帝似乎是某些人的解决方案,但额外的内存开销却相当烦人,我更喜欢可以通过部署脚本(Capistrano)重新启动的更简单的解决方案。
是否有一些bash / Ruby魔法可以实现这一点,或者我注定要在我的服务器上运行一些监视服务,其中包含一些可怕的黑客攻击,以允许站点部署的无法创建的帐户重新启动它?
答案 0 :(得分:0)
delayed_job
文档建议您使用监视服务来管理rake worker工作。我使用runit - 效果很好。
(您可以在不替换init的模式下安装它。)
添加了:
Re:Capistrano重启:是的,runit启用了。做一个
在你的Capistrano食谱中sudo sv kill delayed_job
杀死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)