J'ai rencontré deux causes pour lesquelles delayed_job échoue silencieusement. La première est la présence de segfaults lorsque des personnes utilisaient libxml dans des processus forkés (ceci est apparu sur la liste de diffusion il y a quelque temps).
Le second est un problème lié à la version 1.1.0 des démons sur lesquels s'appuie delayed_job ( https://github.com/collectiveidea/delayed_job/issues#issue/81 ), ceci peut être facilement contourné en utilisant la version 1.0.10 qui est celle de mon propre fichier Gemfile.
Enregistrement
Il y a une journalisation dans delayed_job, donc si le travailleur meurt sans afficher d'erreur, c'est généralement parce qu'il ne lance pas d'exception (par exemple Segfault) ou parce que quelque chose d'externe tue le processus.
Contrôle
J'utilise bluepill pour surveiller mes instances de tâches retardées, et jusqu'à présent cela a été très efficace pour s'assurer que les tâches restent en cours d'exécution. Les étapes pour faire fonctionner bluepill pour une application sont assez simples
Ajoutez la gem bluepill à votre Gemfile :
# Monitoring
gem 'i18n' # Not sure why but it complained I didn't have it
gem 'bluepill'
J'ai créé un fichier de configuration 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
Ensuite, dans mon fichier de déploiement capistrano, j'ai juste ajouté :
# 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
J'espère que cela vous aidera un peu.