Использование Whenever 0.7.3, Rails 3.2.2, Ruby 1.9.3, Passenger 3.0.11 на сервере CentOS 5.6 (я не использую rvm). Проблема в том, что задания cron, созданные when, явно выполняются, я вижу их в журнале 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
Расписание.рб:
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? Кроме того, вывод журнала должен быть ошибкой, к сожалению, он мало что мне говорит.