1

在 CentOS 5.6 服务器上使用无论何时 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?日志输出也应该是一个错误,不幸的是它并没有告诉我太多。

4

3 回答 3

1

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

whenever --set environment=development

将为发展创造环境

于 2012-04-14T06:08:59.867 回答
1

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

我删除了 /usr/bin 中的 ruby​​ 并将正确的路径变量 (PATH="/usr/local/bin:/usr/bin:/bin") 添加到 crontab。现在一切都按预期工作。

于 2012-04-16T15:08:24.820 回答
0

对于未来的 Google 员工:我遇到了完全相同的问题,尽管我的解决方法非常不同......

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

我的项目仍在开发中,所以我确实必须遵循史蒂夫的建议(在某种程度上)并包括set :environment, "development"在我schedule.rb的项目中以查询我的表。

希望这可以帮助其他人!

于 2012-07-31T15:48:53.123 回答