我将delayed_job 与capistrano 一起使用,并且想要一种在Web 应用程序启动时使用'script/delayed_job start' 启动delayed_job 的方法。这样 capistrano 可以在部署时重新启动它。如果服务器重新启动,那么我的delayed_jobs 应该与项目一起启动。
我怎样才能做到这一点?我应该考虑在环境文件中执行此操作还是作为初始化程序?
我将delayed_job 与capistrano 一起使用,并且想要一种在Web 应用程序启动时使用'script/delayed_job start' 启动delayed_job 的方法。这样 capistrano 可以在部署时重新启动它。如果服务器重新启动,那么我的delayed_jobs 应该与项目一起启动。
我怎样才能做到这一点?我应该考虑在环境文件中执行此操作还是作为初始化程序?
结合 capistrano 重启配方,使用 cron 在启动时使用@reboot
crontab 中的特殊时间来启动 delay_job 守护进程非常方便:
@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
可能会在任何一种情况下工作。
您应该使用重新启动命令创建一个配方。
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"
这个问题有点晚了,但delayed_job 2.1.4版有capistrano食谱:
https://github.com/collectiveidea/delayed_job/wiki/Rails-3-and-Capistrano
这是 Damien Mathieu 的答案,但已经是 delay_job gem 的一部分。
这现在适用于 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"
可以使用监视器启动和监视延迟作业:
如何使用监视器监视延迟作业