Florian が提供するリンクには、Amit Solanki によるコードが含まれています。
これをCapistranoで動作させるために私がしたことは次のとおりです。
gem をインストールする
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 はSphinxと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
gem を構成する
行をconfig/schedule.rb
追加して Sphinx のインデックスを更新し、まだ実行されていない場合は 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
これは、sphinx を更新するために 30 分ごとに実行されるcrontabに変換されます。
最終的な注意事項と教訓
はscript/delayed_delta
、daemon_generator gem を使用して、job_runnerバックグラウンド ワーカー スクリプトを開始します。これはrake thinking_sphinx:delayed_deltas
コンソールで実行するのと同じですが、永続的です。
一度に 1 つのjob_runnerまたはrake thinking_sphinx:delayed_deltas
プロセスのみが実行されていることを確認してください
Capistrano に Sphinx (rake ts:rebuild) とscript/delayed_delta
. 別のユーザーまたは別の環境から sphinx とdelayed_deltas を開始したときに問題が発生しました