每当cron作业无法运行时

时间:2015-01-23 13:47:26

标签: ruby-on-rails ruby cron crontab whenever

我试图使用whenever gem将cron作业运行到我的应用程序中。我想重新计算属性" value"我的模特"用户"每两分钟一次。以下是我采取的步骤:

的Gemfile

gem 'whenever', :require => false

终端

$ bundle install
$ wheneverize .

schedule.rb

every 2.minutes do
  runner "User.recalculate"
end

模型/ user.rb

def self.recalculate
  User.all.each {|user| user.recalculate_value }
end

private

def recalculate_value
  self.value = self.value + 1
  self.save!
end

终端

$ whenever --update-crontab
每当-l'

和' $返回此信息:

0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58 * * * * /bin/bash -l -c 'cd /home/website && bin/rails runner -e development '\''User:recalculate'\'''

但到目前为止,User.values中没有任何变化。在我的控制台中运行User.recalculate,所以错误显然是在Whenever中。我错过了什么?

3 个答案:

答案 0 :(得分:4)

我很快创建了一个新的Rails应用程序来尝试重现您的问题,您可以在此处找到它,克隆它并亲自查看。

https://github.com/mlainez/stackoverflow-28111330/blob/master/app/models/user.rb

您要做的第一件事是验证运行器运行的环境。默认情况下,只要使用production。如果您在本地计算机上,请务必在schedule.rb中将其设置为development,或查看文档以了解如何更新crontab并设置正确的环境。

https://github.com/mlainez/stackoverflow-28111330/blob/master/config/schedule.rb#L7

这是您应该在crontab中看到的内容:

0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58 * * * * /bin/bash -l -c 'cd /Users/marc/Projects/stack && bin/rails runner -e development '\''User.recalculate'\'''

注意它是rails runner -e development而不是production

另一件事是巴西亚是对的。当我离开private关键字并尝试在User.recalculate中执行rails c时,它会失败并显示:

private method `recalculate_value' called for #<User ...>

我很惊讶它与您控制台中的private关键字一起使用...您正在尝试访问实例上的私有方法。这在Ruby中是不可能的。您只能从外部访问实例的公共方法(除非您使用send(:method))。

删除private关键字修复它,任务每两分钟按预期运行。

我在我的github代码中使用了Rails 4.2.0和ruby 2.1.0。

修改

确保您的cron守护程序正在运行:

service cron status

我还注意到在你的crontab输出中你有:

bin/rails runner -e development '\''User:recalculate'\''

请注意:User之间的recalculate。你必须在你的schedule.rb

中输入一个拼写错误

它应该是.,因为它是方法调用。

此外,您可能想检查whenever -lcrontab -l的输出是否相同。如果crontab -l不同或为空,那么您没有正确使用whenever --update-crontabwhenever -w,或者您正在使用的版本可能出现问题。

答案 1 :(得分:1)

删除private,因为现在正在运行的User.recalculate将失败并显示private method 'increment' called for #<User>错误。

BTW,用户是ActiveRecord课吗?因为有increment http://apidock.com/rails/ActiveRecord/Base/increment方法和increment!(保存记录),因此最好将方法名称更改为其他名称,或者只使用user.increment!(:value)

答案 2 :(得分:0)

您似乎无法将您的用户保存在方法increment中。试试这个:

def increment
  self.value = self.value + 1
  self.save
end