2

我正在使用 gem 来创建一个 cron 作业。这个 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

时间表.rb:

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

这将创建以下 cronjob:

# 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 没有像我刚刚打开 shell 提示时那样设置相同的环境变量。我还有一个 .rvm 文件,它正在加载我的 ruby​​ 环境,并且每次我 cd 进入主应用程序目录时都会设置。我终于不得不这样做:

# 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=developmentcron 线路连接到“生产”环境时运行。

试试这个:

RAILS_ENV=production rails runner AuctionsHelper.checkForExpiredAuction

如果你得到同样的错误,那就是问题所在

对于测试,将您的生产环境指向您的开发,在 database.yml

production:
  development
于 2012-11-16T21:51:31.270 回答
0

whatever默认为生产,默认情况下会查找生产数据库。要更改此行为,您可以更新 crontab 并将其设置为开发,如下所示:

whenever --update-crontab --set environment='development'

希望这可以节省一些时间,因为它让我有一段时间。

于 2021-01-11T12:29:13.687 回答