1

バックグラウンド ジョブとスケジューリングにSidekiqandを使用しています。Clockworklib/clock.rbのいくつかのレーキタスクを実行するための次のコードがあります:

require 'clockwork'
require File.expand_path('../../config/boot',        __FILE__)
require File.expand_path('../../config/environment', __FILE__)
require 'sidekiq'

include Clockwork
include Sidekiq

module Clockwork    
  every(1.day, 'rake places:get_from_api', at: '22:45') do
    Sidekiq.logger.info 'Starting rake places:get_from_api'
    execute_rake('places.rake', 'places:get_from_api') if Rails.env.production?
  end
end

def execute_rake(file,task)
  require 'rake'
  rake = Rake::Application.new
  Rake.application = rake
  Rake::Task.define_task(:environment)
  load "#{Rails.root}/lib/tasks/#{file}"
  rake[task].invoke
end

アプリケーションを EngineYard にデプロイし、after_restart.rbフックを用意しました。

if environment == 'production'
  cw_pid_file = "#{shared_path}/pids/clockwork.pid"
  # stop clockwork
  run "if [ -d #{current_path} ] && [ -f #{cw_pid_file} ]; then cd #{current_path} && kill -int $(cat #{cw_pid_file}) 2>/dev/null; else echo 'clockwork was not running' ; fi"
  ## start clockwork
  run "cd #{current_path} && bundle exec clockworkd -c #{current_path}/lib/clock.rb --pid-dir #{shared_path}/pids --log --log-dir #{shared_path}/log restart >> log/clockwork.log 2>&1 &"
  run "ps -eo pid,command | grep clockwork | grep -v grep | awk '{print $1}' > #{cw_pid_file}"
end

デプロイ後、ログに例外clockworkd.clock.outputが表示されます。

それを修正する方法は?

4

1 に答える 1

1

エンジンヤードのスタッフです。

エラーを見ると、どこかで Nil の each ステートメントを呼び出そうとしています。おそらくあなたのカスタムレーキタスクにあります。あなたのコードをもっと見ることなく、実際にデバッグすることはできません。

また、時計仕掛けを使用する代わりに、Engine Yard で通常のタスクを実行するためのより良い方法として、単純な Cron タスクをお勧めします。

  1. 環境の下部にある Crontabs をクリックします (画像http://d.pr/i/3Yeo )
  2. ジョブ名、たとえば rake タスクを実行するためのコマンドを指定して、ジョブを追加します。 cd /data/APP_NAME/current && RAILS_ENV=production /usr/local/bin/bundle exec rake task_name
  3. ユーザーと時間間隔を指定して、作成を押します。
  4. 環境に戻り、[適用] を押します。

Rails で cron タスクをセットアップするためのより ruby​​ な方法が必要な場合は、every と呼ばれる素晴らしい gem があります。これを使用すると、 rubyで cron タスクを記述できますが、それらは crontab に書き込まれます。Engine YardのGoogleは、他の人がどのようにそれを行ったかについていくつかの投稿を返しますが、あなたが示したように簡単なことを行うには、上記の手順がおそらく最も簡単でしょう.

于 2013-07-18T11:55:46.760 に答える