在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 回答
您可能没有正确设置环境 . 如果您正处于开发设置中:
将环境设定为发展
好了,现在解决了 . 问题是我在/ usr / bin中都有一个Ruby,在/ usr / local / bin中有一个Ruby .
我删除了/ usr / bin中的ruby并将正确的路径变量(PATH =“/ usr / local / bin:/ usr / bin:/ bin”)添加到crontab中 . 一切都按预期工作了 .
对于未来的Google员工:我遇到了同样的问题,尽管我的解决方案非常不同......
我通过将
set :output,'./cronOutput.txt'
放在我的schedule.rb
文件中来记录输出,并继续将No JavaScript runtine found
作为输出错误 . 所以我去安装了execjs和therubyracer宝石 . 事后,一切都开始了 .我的项目仍在开发中,所以我确实必须遵循Steve的建议(稍微)并在我的
schedule.rb
中包含set :environment, "development"
以便查询我的表格 .希望这可以帮助其他人!