namespace :resque do
desc 'Restart all workers for this application using monit' task :restart do unless fetch(:no_release, false) on roles :worker do execute :sudo, 'monit reload' sleep 2 execute :sudo, "monit -g resque_workers_#{fetch(:resque_application)} restart" execute :sudo, "monit -g resque_workers_#{fetch(:resque_application)} summary" end end end desc <<-EOS Set up init.d and monit.d files for all resque workers. This task does nothing by default. You should define it in your `deploy.rb` and configure your workers with `resque_worker_monitd` and `resque_worker_initd`. EOS task :config_workers do end
end
after 'deploy', 'resque:restart' before 'monit:config', 'resque:config_workers' after 'monit:config', 'resque:restart'
namespace :load do
task :defaults do set :resque_application, ->{ fetch(:application) } # Used to namespace the workers; should not contain spaces. end
end
def resque_worker_monitd(name, host, options = {})
file = Capistrano::ResqueMonit.file_name(name) mem = options[:totalmem] || '675' depends = [] depends << 'redis' depends << options[:depends] depends.flatten! depends.compact! depends = depends.empty? ? '' : "depends on #{depends.join(', ')}" script = Capistrano::ResqueMonit.template( 'resque_monitd', depends: depends, file: file, current_path: current_path, mem: mem, resque_application: fetch(:resque_application) ) Capistrano::ResqueMonit.put_as_root(script, "/etc/monit.d/#{file}", host, :mode => 0644)
end
def resque_worker_initd(worker, host, options = {})
queue = options[:queue] || worker file = Capistrano::ResqueMonit.file_name(worker) script = Capistrano::ResqueMonit.template( 'resque_initd', gem_home: fetch(:gem_home, Capistrano::ResqueMonit.find_gem_home(host)), current_path: current_path, rails_env: fetch(:rails_env), queue: queue, file: file ) Capistrano::ResqueMonit.put_as_root(script, "/etc/init.d/#{file}", host, :mode => 0755)
end