Rails3 Всякий раз, когда не работает из cron, но отлично работает с терминала

Использование 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? Кроме того, вывод журнала должен быть ошибкой, к сожалению, он мало что мне говорит.


person Berggeit    schedule 14.04.2012    source источник


Ответы (3)


Вы, вероятно, не правильно настроили среду. Если вы находитесь в режиме разработки:

whenever --set environment=development

настроит среду на развитие

person Steve    schedule 14.04.2012
comment
Извините, но я думал, что не нахожусь в нужном окружении. - person Steve; 14.04.2012
comment
Спасибо и нет проблем. Я добавил версию Passenger к исходному вопросу, чтобы было более понятно, что я говорю о производственной среде. - person Berggeit; 14.04.2012
comment
Просто чтобы прояснить для тех, кто будет читать это в будущем, приведенный выше код следует запускать в командной строке, а не помещать в файл. - person GMA; 19.06.2013

Хорошо решил это сейчас. Проблема заключалась в том, что у меня был и Ruby в /usr/bin, и Ruby в /usr/local/bin.

Я удалил ruby ​​в /usr/bin и добавил правильную переменную пути (PATH="/usr/local/bin:/usr/bin:/bin") в crontab. Теперь все работает, как ожидалось.

person Berggeit    schedule 16.04.2012

Для будущих гуглеров: у меня была точно такая же проблема, хотя моя решалась совсем по-другому...

Я записал выходные данные, поместив set :output,'./cronOutput.txt' в свой файл schedule.rb, и продолжал получать No JavaScript runtine found в качестве ошибки вывода. Итак, я пошел и установил execjs и therubyracer. Сразу после этого все начало работать.

Мой проект все еще находился в разработке, поэтому мне пришлось (отчасти) последовать совету Стива и включить set :environment, "development" в мой schedule.rb, чтобы запрашивать мои таблицы.

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

person XML Slayer    schedule 31.07.2012