Rails3 Всякий раз, когда не работает с cron, но отлично с терминала
Использование Everyever 0.7.3, Rails 3.2.2, Ruby 1.9.3, Passenger 3.0.11 на сервере CentOS 5.6 (я не использую 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, эта "ошибка (?)" Печатается только один раз в журнале.
Есть ли разница между выполнением чего-либо из cron job или вводом кода в терминале? Почему может быть разница, и как я могу гарантировать, что это также работает от cron job? Кроме того, вывод журнала должен быть ошибкой, но, к сожалению, он мне мало что говорит.
3 ответа
Хорошо, решил это сейчас. Проблема была в том, что у меня был и Ruby в / usr / bin, и Ruby в / usr / local / bin.
Я удалил ruby в / usr / bin и добавил правильную переменную пути (PATH="/usr/local/bin:/usr/bin:/bin") в crontab. Теперь все работает, как и ожидалось.
Вы, вероятно, не установили среду должным образом. Если вы находитесь в процессе разработки:
whenever --set environment=development
установит среду для развития
Для будущих Googlers: у меня была точно такая же проблема, хотя моя была решена совсем по-другому...
Я записал вывод, поставив set :output,'./cronOutput.txt'
в моем schedule.rb
файл, и продолжал получать No JavaScript runtine found
как ошибка вывода. Итак, я пошел и установил execjs и therubyracer. Все начало работать сразу после этого.
Мой проект все еще находился в разработке, поэтому я должен был следовать совету Стива (несколько) и включить set :environment, "development"
в моем schedule.rb
а также для того, чтобы запросить мои таблицы.
Надеюсь, это поможет кому-нибудь еще!