代码之家  ›  专栏  ›  技术社区  ›  user4219892

每当cron作业无法运行时

  •  1
  • user4219892  · 技术社区  · 11 年前

    我正在尝试使用 whenever gem将cron作业运行到我的应用程序中。我想每两分钟重新计算一次模型“User”的属性“value”。以下是我采取的步骤:

    Gemfile公司

    gem 'whenever', :require => false
    

    航空站

    $ bundle install
    $ wheneverize .
    

    计划.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
    

    而'$every-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 在我的控制台工作,所以错误显然是在每当。我错过了什么?

    3 回复  |  直到 11 年前
        1
  •  4
  •   Marc Lainez    11 年前

    我很快创建了一个新的Rails应用程序,试图重现你的问题,你可以在这里找到它,克隆它,自己看看。

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

    您首先要做的是验证运行程序正在运行的环境 production 。如果您在本地计算机上,请确保将其设置为 development 在schedule.rb中,或查看文档以了解如何更新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 而不是 生产 .

    另一件事是,basia是对的。当我离开 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 。您的日程中一定有拼写错误。rb

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

    此外,您可能需要检查 whenever -l crontab -l 都是一样的。如果 crontab-l 是不同的或空的,那么您没有使用 whenever --update-crontab whenever -w 正确,或者您使用的任何版本都可能有问题。

        2
  •  1
  •   basiam    11 年前

    去除 private 从现在开始运行 User.recalculate 将失败 private method 'increment' called for #<User> 错误

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

        3
  •  0
  •   Arjan    11 年前

    您似乎没有在方法中保存用户 increment 。请尝试以下操作:

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