2

cronジョブを作成するためにgemを使用しています。このcronジョブは、定期的にRailsアプリでヘルパーメソッドを実行する必要があります。このヘルパーメソッドは、モデルのすべてのインスタンスをチェックし、それを更新するかどうかを決定します。

/app/helpers/auctions_helper.rb:

module AuctionsHelper

  def self.checkForExpiredAuction
    # method to update each auction that has expired
    puts "There are currently #{Auction.count} auctions."

    @auctions = Auction.all
    @auctions.each do |auction|
      if auction.end_time > Time.now.utc
        auction.price = 1000000
        auction.save
        puts "just updated #{auction.product} auction"
      end
    end
    puts "just updated any auctions that had expired"
  end
end

schedule.rb:

set :output, "log/cron_log.log"
every 1.minute do
  runner "AuctionsHelper.checkForExpiredAuction"
end

これにより、次のcronジョブが作成されます。

# Begin Whenever generated tasks for: bestBay
            * * * * * /bin/bash -l -c 'cd /home/bestbay && script/rails runner -e production '\''AuctionsHelper.checkForExpiredAuction'\'' >> log/cron_log.log 2>&1'
#    End Whenever generated tasks for: bestBay

私が抱えている問題は、ヘルパーメソッドがテーブル「オークション」にアクセスできないことです。私のcron_log.logから:

Could not find table 'auctions' (ActiveRecord::StatementInvalid)

これは、ヘルパーメソッド自体の問題ではないようです。ターミナルから実行する場合:

rails runner AuctionsHelper.checkForExpiredAuction

putsメッセージから素晴らしい出力セットを取得します。では、なぜcronjobがモデル/テーブルにアクセスできないのですか?

4

3 に答える 3

2

基本的な問題は、シェル プロンプトを開いたときと同じ環境変数を cron がスプールしていないことでした。また、メインのアプリケーション ディレクトリに移動するたびに、Ruby 環境をロードして getset する .rvm ファイルもありました。私はついにこれをしなければなりませんでした:

# set the cron log location
set :output, {:error => '/home/jason/bestbay/log/cron_error.log', :standard => '/home/jason/bestbay/log/cron_status.log'}
set :job_template, "bash -i -c ':job'"
env :PATH, ENV['PATH']

every 1.minute do
  #command "echo $PATH"                             # confirm shell variable PATH was loaded
  #command "cd #{path}"                             # this is not needed
  #command "pwd"                                    # visualize current directory
  #command "rvm current"                            # visualized default ruby version and gemset
  command "rvm use ruby-1.9.3-p194@cmucourse"       # set desired gemest
  #command "rvm current"                            # visualize proper gemset load

  runner "AuctionsHelper.checkForExpiredAuction", :environment => 'development' # run method
end

コメントアウトされたコマンドを含めているのは、cron の実行時に何が起こっていたかを視覚化するのに本当に役立ったからです。

于 2013-02-27T22:03:09.433 に答える
0

RAILS_ENV=developmentデフォルトでは、cronラインが「本番」環境で実行するように配線されている間、ランナーが実行されると思います。

これを試して:

RAILS_ENV=production rails runner AuctionsHelper.checkForExpiredAuction

同じエラーが発生する場合は、それが問題です

テストのために、database.yml で実稼働環境を開発に向けます。

production:
  development
于 2012-11-16T21:51:31.270 に答える