在生产中,由于某种原因,我们的delayed_job
进程快要死了。我不确定它是否崩溃或被操作系统杀死或被什么杀死。我在delayed_job.log
文件中没有看到任何错误。
我该怎么做才能解决此问题?我当时正在考虑安装monit进行监视,但这只会告诉我它何时死亡。它不会真正告诉我它为什么死亡。
有没有一种方法可以使日志文件更加健谈,所以我可以说出为什么它快要死了吗?
还有其他建议吗?
最佳答案
我遇到了两个导致delay_job静默失败的原因。第一个是人们在 fork 进程中使用libxml时的实际段错误(前段时间它出现在邮件列表中)。
第二个是与delay_job依赖的守护程序1.1.0版本有关的问题(https://github.com/collectiveidea/delayed_job/issues#issue/81),可以使用我自己的Gemfile使用1.0.10轻松解决此问题。
记录中
登录到delay_job,因此如果 worker 死亡而没有打印错误,通常是因为它没有引发异常(例如Segfault)或外部原因正在杀死该进程。
监控方式
我使用bluepill监视延迟的作业实例,到目前为止,在确保作业保持运行方面非常成功。为应用程序运行bluepill的步骤非常简单
将bluepill gem添加到您的Gemfile中:
# Monitoring
gem 'i18n' # Not sure why but it complained I didn't have it
gem 'bluepill'
我创建了一个bluepill配置文件:
app_home = "/home/mi/production"
workers = 5
Bluepill.application("mi_delayed_job", :log_file => "#{app_home}/shared/log/bluepill.log") do |app|
(0...workers).each do |i|
app.process("delayed_job.#{i}") do |process|
process.working_dir = "#{app_home}/current"
process.start_grace_time = 10.seconds
process.stop_grace_time = 10.seconds
process.restart_grace_time = 10.seconds
process.start_command = "cd #{app_home}/current && RAILS_ENV=production ruby script/delayed_job start -i #{i}"
process.stop_command = "cd #{app_home}/current && RAILS_ENV=production ruby script/delayed_job stop -i #{i}"
process.pid_file = "#{app_home}/shared/pids/delayed_job.#{i}.pid"
process.uid = "mi"
process.gid = "mi"
end
end
end
然后在我的capistrano部署文件中,我刚刚添加了:
# Bluepill related tasks
after "deploy:update", "bluepill:quit", "bluepill:start"
namespace :bluepill do
desc "Stop processes that bluepill is monitoring and quit bluepill"
task :quit, :roles => [:app] do
run "cd #{current_path} && bundle exec bluepill --no-privileged stop"
run "cd #{current_path} && bundle exec bluepill --no-privileged quit"
end
desc "Load bluepill configuration and start it"
task :start, :roles => [:app] do
run "cd #{current_path} && bundle exec bluepill --no-privileged load /home/mi/production/current/config/delayed_job.bluepill"
end
desc "Prints bluepills monitored processes statuses"
task :status, :roles => [:app] do
run "cd #{current_path} && bundle exec bluepill --no-privileged status"
end
end
希望这有所帮助。