Подтвердить что ты не робот

Запуск delayed_job при запуске

Я использую delayed_job с capistrano и хотел бы запустить delayed_job при запуске веб-приложения, используя "script/delayed_job start". Таким образом, capistrano может перезапустить его при развертывании. Если сервер перезагружается, то мои delayed_job должны запускаться с проектом.

Как я могу это сделать? Должен ли я смотреть на это в файлах среды или в качестве инициализатора?

4b9b3361

Ответ 1

Вы должны создать один рецепт с командой перезагрузки.

namespace :delayed_job do 
    desc "Restart the delayed_job process"
    task :restart, :roles => :app do
        run "cd #{current_path}; RAILS_ENV=#{rails_env} script/delayed_job restart"
    end
end

Затем вы добавляете его для выполнения в конце развертывания.

after "deploy:update_code", "delayed_job:restart"

Ответ 2

В сочетании с рецептом перезапуска capistrano довольно удобно использовать cron, чтобы запустить запуск delayed_job при запуске, используя специальное время @reboot в crontab:

@reboot /bin/bash -l -c 'cd /path/to/app && RAILS_ENV=production script/delayed_job restart'

И еще удобнее вместе с whenever настроить запланированную задачу:

job_type :envcommand, 'cd :path && RAILS_ENV=:environment :task'

every :reboot do
  envcommand 'script/delayed_job restart'
end

Не уверен, что вся реализация cron фактически запускает @reboot при запуске системы, но по крайней мере шлейфы Ubuntu запускают их только при запуске, а не при запуске или перезапуске демона cron. Если вы пройдете restart до script/delayed_job, он, вероятно, будет работать в любом случае.

Ответ 4

Теперь это работает как с Rails 2, так и с 3:

В deploy.rb добавьте следующие строки:

require "delayed/recipes"
set :rails_env, 'production' #added for delayed_job
before "deploy:restart", "delayed_job:stop"
after  "deploy:restart", "delayed_job:start"
after "deploy:stop",  "delayed_job:stop"
after "deploy:start", "delayed_job:start"