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 а также для того, чтобы запросить мои таблицы.

Надеюсь, это поможет кому-нибудь еще!

Другие вопросы по тегам