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ジョブが実行された時点で、この「エラー(?)」はログに1回だけ出力されます。
cronジョブから何かを実行することと、ターミナルにコードを入力することには違いがありますか?なぜ違いがあり、それがcronjobからも機能することを確認するにはどうすればよいですか?また、ログ出力はエラーであると想定されていますが、残念ながらあまりわかりません。