【问题标题】:Rails3 Whenever not working from cron, but perfectly from terminalRails3 无论何时不能从 cron 工作,但可以从终端完美地工作
【发布时间】:2023-03-27 18:20:01
【问题描述】:

在 CentOS 5.6 服务器上使用 When 0.7.3、Rails 3.2.2、Ruby 1.9.3、Passenger 3.0.11(我没有使用 rvm)。问题是无论何时创建的 cron 作业都清楚地执行了,我可以在 Cron 日志中看到它们,但是它们实际上并没有执行 Rails 代码。如果我复制 cron 代码并将其粘贴到终端中,它会按预期工作。

要执行的代码:

class SomeModel < ActiveRecord::Base

  #Delete all items that haven't been updated for 2 hours or more
  def self.cron_job
    SomeModel.destroy_all(updated_at < ?", 2.hours.ago])
  end
end

schedule.rb:

set :output, "/var/log/cron"

every 1.day, :at => '4:45 am' do
  runner "SomeModel.cron_job"
end

其中生成了以下 cron(输出 crontab -l):

# Begin Whenever generated tasks for: site_name
45 4 * * * /bin/bash -l -c 'cd /home/user/domains/site_name && script/rails runner -e production '\''SomeModel.cron_job'\'' >> /var/log/cron 2>&1'
# End Whenever generated tasks for: site_name

如果我第二天早上检查,我会在 cron 日志中找到:

Apr 14 04:45:01 node1 crond[9155]: (root) CMD (/bin/bash -l -c 'cd /home/user/domains/site_name && script/rails runner -e production '\''SomeModel.cron_job'\'' >> /var/log/cron 2>&1')

但是,应该删除的项目仍在数据库中。如果我复制 cron 应该执行的代码 (/bin/bash -l -c 'cd ... 2>&1' 并从终端执行它,那么这些项目将按预期删除。

此外,当我从终端手动执行代码时,没有错误,在 cron 日志中我看到以下内容:

from script/rails:5:in 'require'
from script/rails:5
from script/rails:5:in 'require'
from script/rails:5

在执行多个 cron 作业的时刻,此“错误(?)”仅在日志中打印一次。

从 cronjob 执行某些操作或在终端中输入代码有区别吗?为什么会有区别,我如何确保它也适用于 cronjob?日志输出也应该是一个错误,不幸的是它并没有告诉我太多。

【问题讨论】:

    标签: ruby-on-rails-3 cron centos5 whenever


    【解决方案1】:

    对于未来的 Google 员工:我也遇到过同样的问题,虽然我的解决方法非常不同......

    我通过将set :output,'./cronOutput.txt' 放入我的schedule.rb 文件来记录输出,并不断收到No JavaScript runtine found 作为输出错误。所以我去安装了execjstherubyracer gems。之后一切都立即开始工作。

    我的项目仍在开发中,所以我确实必须听从 Steve 的建议(在某种程度上)并在我的 schedule.rb 中包含 set :environment, "development" 以便查询我的表。

    希望这对其他人有所帮助!

    【讨论】:

      【解决方案2】:

      好的,现在解决了。问题是我在 /usr/bin 中有一个 Ruby,在 /usr/local/bin 中有一个 Ruby。

      我已删除 /usr/bin 中的 ruby​​,并将正确的路径变量 (PATH="/usr/local/bin:/usr/bin:/bin") 添加到 crontab。现在一切正常。

      【讨论】:

        【解决方案3】:

        您可能没有正确设置环境。如果您处于开发环境中:

        whenever --set environment=development
        

        将环境设置为开发

        【讨论】:

        • 很抱歉,没有处于正确的环境是我想提出来的一个常见错误
        • 谢谢,没问题。我已将乘客版本添加到原始问题中,更清楚地表明这是我正在谈论的生产环境。
        • 只是为了让以后阅读本文的人澄清一下,上面的代码应该在命令行中运行,而不是放在文件中。
        猜你喜欢
        • 2015-08-12
        • 2018-01-08
        • 1970-01-01
        • 2012-06-12
        • 2020-10-06
        • 2020-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多