在 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?日志输出也应该是一个错误,不幸的是它并没有告诉我太多。