首页 文章

Rails3每当没有从cron工作,但完全来自终端

提问于
浏览
1

在CentOS 5.6服务器上使用Whenever 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工作?也是日志输出应该是一个错误,不幸的是它并没有告诉我 .

3 回答

  • 1

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

    whenever --set environment=development
    

    将环境设定为发展

  • 0

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

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

  • 1

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

    我通过将 set :output,'./cronOutput.txt' 放在我的 schedule.rb 文件中来记录输出,并继续将 No JavaScript runtine found 作为输出错误 . 所以我去安装了execjstherubyracer宝石 . 事后,一切都开始了 .

    我的项目仍在开发中,所以我确实必须遵循Steve的建议(稍微)并在我的 schedule.rb 中包含 set :environment, "development" 以便查询我的表格 .

    希望这可以帮助其他人!

相关问题