3

Thinking Sphinx をセットアップして動作させていますが、デプロイ中に遅延ジョブ rake タスクを開始するのに問題があります。

deploy.rb に次のタスクがあり、実行されているように見えますが、遅延したジョブは処理されません。サーバー コマンド ラインから rake ts:dd を実行するまでスタックします。

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

デプロイ スクリプトから遅延ジョブの実行を開始するにはどうすればよいですか?

ありがとう

サイモン

4

3 に答える 3

2

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 はSphinxjob_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


whenevergem を構成する

行を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_deltadaemon_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 を開始したときに問題が発生しました

于 2010-07-11T10:33:22.537 に答える
2

このリンクは、デプロイ スクリプトからdelayed_delta rake タスクを再起動する必要がある場合に役立ちます:

http://amitsolanki.com/2010/04/running-delayed-delta-daemon-in-background-for-thinking-sphinx/#comment-5802

于 2010-06-25T09:08:32.283 に答える
1

delay_jobタスクを別のスクリプトに入れてcronから実行するか、選択した監視ツール(たとえばmonit)で開始/監視します。デプロイスクリプトは、それを強制終了して、毎回再起動するようにすることができます(killall job_runner)。私が使用するスクリプトは次のとおりです。

#!/ usr / bin / env ruby
##このスクリプトは、delayed_jobsが実行されることを確認するためのものです
##スフィンクスを考えることで使用されます
File.dirname(__ FILE__)+'/../config/environment'が必要

#これの定義をconfig / environment / *。rbに入れることもできるので、テスト、本番、開発で異なります
JobRunnerPidFile = "#{RAILS_ROOT} /tmp/pids/job_runner.pid"

File.exists?(JobRunnerPidFile)の場合
  old_pid = File.read(JobRunnerPidFile).to_i
  始める
    Process.getpgid(old_pid)>0の場合
      #まだ実行中です、静かに終了しましょう...
      exit(0)
    終わり
  救援
    #何も実行されていないように見えるので、続けましょう
  終わり
終わり

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

Delayed :: Worker.new.start
于 2010-01-06T15:43:03.523 に答える