2009-12-10 4 views
3

У меня есть настройка и работа с мышлением Sphinx, но у меня возникла проблема с запуском заданий rake Delayed Job во время развертывания.Как начать Запланируйте задачу сглаживания сфинкса с помощью дельта-рейка из сценария развертывания?

У меня есть следующая задача в deploy.rb, который, как представляется, выполнить, однако отсроченные задания не обрабатываются - они складывают, пока не закончатся грабли ц: дд из командной строки сервера:

namespace :thinkingsphinx do 
    desc 'Start Delayed Job Sphinx delta indexing' 
    task :dd do 
    run "cd #{current_path} && rake ts:dd RAILS_ENV=#{rails_env} &" 
    end 
end 

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

Благодаря

Simon

ответ

2

link Флориан предоставленном код Амит Соланка это работает!

Вот что я сделал, чтобы получить эту работу с Capistrano:

Установите камни


Создайте файл с именем script/delayed_delta с содержимым:

#!/usr/bin/env ruby 
require 'rubygems' 
require 'daemons' 
dir = File.expand_path(File.join(File.dirname(__FILE__), '..')) 

daemon_options = { 
    :multiple => false, 
    :dir_mode => :normal, 
    :dir => File.join(dir, 'tmp', 'pids'), 
    :backtrace => true 
} 
puts 'delayed_delta' 

Daemons.run_proc('job_runner', daemon_options) do 
    if ARGV.include?('--') 
    ARGV.slice! 0..ARGV.index('--') 
    else 
    ARGV.clear 
    end 

    Dir.chdir dir 
    RAILS_ENV = ARGV.first || ENV['RAILS_ENV'] || 'development' 
    require File.join('config', 'environment') 

    Delayed::Worker.new(
    :min_priority => ENV['MIN_PRIORITY'], 
    :max_priority => ENV['MAX_PRIORITY'] 
).start 
end 


Настройка Capistrano

Capistrano должен начать Сфинкса и job_runner (с нашей script/delayed_delta).

Добавить что-то вроде этого в deploy.rb:

deploy.task :restart, :roles => :app do 
    run "export RAILS_ENV=production && cd #{deploy_to}/current && /usr/bin/rake ts:rebuild" 
    run "export RAILS_ENV=production && cd #{current_path} && /usr/bin/ruby script/delayed_delta start" 
end 


Настройка whenever камень

В ваших config/schedule.rb добавить строки для обновления индекса Сфинкса и начать job_runner, если он еще не запущен

every 30.minutes do 
    command "export RAILS_ENV=production && cd /path/to/rails/production && /usr/bin/rake ts:index && /usr/bin/ruby script/delayed_delta start" 
end 

Это конвертируется в кронтаб, который выполняется каждые 30 минут, чтобы обновить сфинкса


Заключительные Замечания и извлеченные уроки

  • script/delayed_delta использует это daemon_generator драгоценный камень, чтобы начать job_runner фоновый рабочий сценарий. Это эквивалентно запуску rake thinking_sphinx:delayed_deltas на консоли, но постоянному.

  • Убедитесь, что только один job_runner или rake thinking_sphinx:delayed_deltas процесс выполняется в одно время

  • Пусть Capistrano начать как Sphinx (рейк ц: восстановление) и script/delayed_delta. У меня возникла проблема, когда я начал использовать sphinx и delayed_deltas у разных пользователей или в разных средах.

1

Я бы поставил свою задачу delayed_job в отдельном сценарии и запустить его из хрон или же он начал/мониторинг вашего инструмента мониторинга выбора (например, monit). Ваш скрипт развертывания может просто убить его, чтобы он каждый раз перезапускался (killall job_runner). Вот скрипт я использую:

 
#!/usr/bin/env ruby 
## this script is for making sure and delayed_jobs get run 
## it is used by thinking sphinx 
require File.dirname(__FILE__) + '/../config/environment' 

# you can also put the definition of this in config/environments/*.rb so it's different for test, production and development 
JobRunnerPidFile = "#{RAILS_ROOT}/tmp/pids/job_runner.pid" 

if File.exists?(JobRunnerPidFile) 
    old_pid = File.read(JobRunnerPidFile).to_i 
    begin 
    if Process.getpgid(old_pid) > 0 
     # still running, let's exit silently... 
     exit(0) 
    end 
    rescue 
    # looks like nothing is running, so let's carry on 
    end 
end 

File.open(JobRunnerPidFile, "w") {|f| f.write "#{$$}\n" } 

Delayed::Worker.new.start