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

此链接对于需要从部署脚本重新启动 delay_delta rake 任务的任何人都很有用:

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

于 2010-06-25T09:08:32.283 回答
2

Florian 提供的链接具有 Amit Solanki 的代码,该代码有效!

这是我为使其与 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 需要启动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

这将转换为每 30 分钟运行一次以更新 sphinx的crontab


最后的笔记和经验教训

  • 使用script/delayed_deltadaemon_generator gem 来启动job_runner后台工作脚本。这相当于rake thinking_sphinx:delayed_deltas在控制台上运行,但持久化。

  • 确保一次只运行一个job_runnerrake thinking_sphinx:delayed_deltas进程

  • 让 Capistrano 启动 Sphinx (rake ts:rebuild) 和script/delayed_delta. 当我从不同用户或不同环境启动 sphinx 和 delay_deltas 时遇到问题

于 2010-07-11T10:33:22.537 回答
1

我会将您的delayed_job 任务放在一个单独的脚本中并从cron 运行它,或者由您选择的监控工具(例如,monit)启动/监控它。您的部署脚本可以杀死它以确保它每次都重新启动(killall job_runner)。这是我使用的脚本:

#!/usr/bin/env 红宝石
## 此脚本用于确保延迟作业运行
## 被思维斯芬克斯使用
需要 File.dirname(__FILE__) + '/../config/environment'

# 你也可以把 this 的定义放在 config/environments/*.rb 中,这样它在测试、生产和开发中是不同的
JobRunnerPidFile = "#{RAILS_ROOT}/tmp/pids/job_runner.pid"

如果 File.exists?(JobRunnerPidFile)
  old_pid = File.read(JobRunnerPidFile).to_i
  开始
    如果 Process.getpgid(old_pid) > 0
      # 还在运行,让我们静默退出...
      退出(0)
    结尾
  救援
    # 看起来没有运行,所以让我们继续
  结尾
结尾

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

延迟::Worker.new.start
于 2010-01-06T15:43:03.523 回答