Problem jest następujący:
W portalu są operacje, które operują na dużych plikach excela i csv. Zadania te odpalane są za pomocą delayed_job:
price_set.send_later :import
Wszystko działa git nie licząc samego odpalania procesu delayed_job. Logicznym byłoby odpalać proces razem z serverem gdzieś w init-cie, ale powoduje to zapętlenie serwera, bo każdy z 2 sposobów odpalenia tasków (rake jobs:work i ruby script/delayed_job start) powoduje inicjację serwera i odpala nieskończoną liczbę procesów. Można ewentualnie “z palca” odpalić proces na serwerze, ale najwyraźniej proces taki ginie razem z końcem sesji (druga sprawa, że to trochę niezbyt dobry pomysł). Kolejna opcja to capistrano razem z poniższym skryptem:
[code]after “deploy:stop”, “delayed_job:stop”
after “deploy:start”, “delayed_job:start”
after “deploy:restart”, “delayed_job:restart”
namespace :deploy do
desc “Restarting mod_rails with restart.txt”
task :restart, :roles => :app, :except => { :no_release => true } do
run “touch #{current_path}/tmp/restart.txt”
end
end
namespace :delayed_job do
desc “Stop the delayed_job process”
task :stop, :roles => :app do
run “cd #{current_path}; RAILS_ENV=production script/delayed_job stop”
end
desc “Start the delayed_job process”
task :start, :roles => :app do
run “cd #{current_path}; RAILS_ENV=production script/delayed_job start”
end
desc “Restart the delayed_job process”
task :restart, :roles => :app do
run “cd #{current_path}; RAILS_ENV=production script/delayed_job restart”
end
end[/code]
Powyższe rozwiązanie jednak działa nadal dość tymczasowo i proces ginie.
Aha, muszę dodać że konfiguracja serwera to Apache + Phusion Passenger.
Kolejna możliwość to dodać bluepill do startowania delayed_job:
[code]#deploy.rb
after “deploy:restart”, “bluepill:quit”, “bluepill:start”
namespace :bluepill do
desc “Stop processes that bluepill is monitoring and quit bluepill”
task :quit, :roles => [:app] do
sudo “bluepill stop”
sudo “bluepill quit”
end
desc “Load bluepill configuration and start it”
task :start, :roles => [:app] do
sudo “bluepill load /home/www/app/current/config/production.pill”
end
desc “Prints bluepills monitored processes statuses”
task :status, :roles => [:app] do
sudo “bluepill status”
end
end
#production.pill
Bluepill.application(“app”) do |app|
app.process(“delayed_job”) do |process|
process.start_command = "/home/www/app/current/script/delayed_job start RAILS_ENV=production"
process.pid_file = "/home/www/app/current/tmp/pids/delayed_job.pid"
process.stop_command = "/home/www/app/current/script/delayed_job stop RAILS_ENV=production"
process.uid = "deploy"
process.gid = "deploy"
end
end[/code]
Co zrobić, żeby to zaczeło działać jak powinno?