2015-01-23 4 views
1

Я пытаюсь использовать жемчужину whenever для запуска заданий cron в моем приложении. Я хочу пересчитать атрибут «значение» моей модели «Пользователь» каждые две минуты. Вот шаги, которые я взял:Всякий раз, когда выполняются задания cron

Gemfile

gem 'whenever', :require => false 

терминал

$ bundle install 
$ wheneverize . 

schedule.rb

every 2.minutes do 
    runner "User.recalculate" 
end 

модели/user.rb

def self.recalculate 
    User.all.each {|user| user.recalculate_value } 
end 

private 

def recalculate_value 
    self.value = self.value + 1 
    self.save! 
end 

терминал

$ whenever --update-crontab 

и '$, когда -l' возвращает это:

0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58 * * * * /bin/bash -l -c 'cd /home/website && bin/rails runner -e development '\''User:recalculate'\''' 

Но до сих пор ничего не изменилось в моем User.values. Запуск User.recalculate в моей консоли работает, поэтому ошибка, по-видимому, всегда. Что мне не хватает?

+0

Можете ли вы предоставить какие-либо журналы или выходные данные, чтобы сделать вопрос более понятным? –

+0

@StanislavMekhonoshin Журналы или вывод откуда? –

+0

Когда вы запускаете каждый раз через crontab, он записывает сообщения в syslog. Вы также можете попробовать запустить User.recalculate в консоли rails, чтобы проверить, что код работает хорошо, и это когда-либо проблема. –

ответ

4

Я быстро создал новое приложение Rails, чтобы попытаться воспроизвести вашу проблему, вы можете найти его здесь, клонировать и видеть сами.

https://github.com/mlainez/stackoverflow-28111330/blob/master/app/models/user.rb

Первое, что вы хотите сделать, это проверить, что среда бегун работает. По умолчанию, когда используется production. Если вы находитесь на своем локальном компьютере, обязательно установите его в development в свой расписание.rb или проверьте документацию, чтобы узнать, как обновить crontab и установить правильную среду.

https://github.com/mlainez/stackoverflow-28111330/blob/master/config/schedule.rb#L7

Это то, что вы должны увидеть в вашем кронтаб:

0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58 * * * * /bin/bash -l -c 'cd /Users/marc/Projects/stack && bin/rails runner -e development '\''User.recalculate'\''' 

Обратите внимание, что говорит rails runner -e development и не production.

Другое дело, что база была права.Когда я оставляю private ключевое слово и попытаться выполнить User.recalculate в rails c, он терпит неудачу с:

private method `recalculate_value' called for #<User ...> 

Я удивлен, что он работает с частным ключевым словом в консоли ... Вы пытаетесь получить доступ приватного метода на экземпляр. Это невозможно в Ruby. Вы можете использовать только общедоступные методы экземпляра извне (если вы не используете send(:method)).

Удаление закрытого ключевого слова зафиксировано, и задача выполнялась как ожидалось каждые две минуты.

Я использую Rails 4.2.0 и ruby ​​2.1.0 в своем коде github.

EDIT

Убедитесь, что демон cron запущен с помощью:

service cron status 

Я также заметил, что в вашем выводе кронтаб у вас есть:

bin/rails runner -e development '\''User:recalculate'\'' 

Обратите внимание на : между User и recalculate. Вы, должно быть, сделали опечатку в своем расписании. Rb

Это должно быть ., так как это вызов метода.

Кроме того, вы можете проверить, что выходные данные от whenever -l и crontab -l одинаковы. Если crontab -l отличается или пуст, то вы не используете whenever --update-crontab или whenever -w правильно, или что-то может быть не так с той версией, которую вы используете.

+0

Есть ли что-то, что мне нужно сделать, чтобы инициализировать cron или что-то в этом роде? Я изменил среду по умолчанию на разработку, переместил весь код из раздела 'private' и перезапустил сервер, но он все еще не выполняет задачу. Я обновил вывод '$ when -l' выше. –

+0

Отредактировал мой ответ –

+0

Хорошо, я знал, что у меня что-то не хватает. '$ service crond status' возвращает" crond: unrecognized service ". Как запустить демон cron? –

0

Вы, кажется, не сохраняете своего пользователя в своем методе increment. Попробуйте это:

def increment 
    self.value = self.value + 1 
    self.save 
end 
+0

О, это ошибка. Я сохраняю в своем исходном коде: я обновил вопрос. –

1

private Удалить, поскольку сейчас работает User.recalculate завершится с ошибкой private method 'increment' called for #<User>.

BTW, является ли пользователь классом ActiveRecord? Причина есть incrementметод и increment! (сохраняет запись), поэтому может быть хорошей идеей изменить название метода на что-то другое или просто использовать user.increment!(:value).

+0

Да, это класс ActiveRecord. Спасибо за подсказку, я изменил 'increment' на' recalculate_value'. –

+0

круто, а как насчет удаления 'private'? Помогло ли это? – basiam

+0

Я оставил 'private', но работает' User.recalculate' в консоли работает, поэтому я не думаю, что есть какие-либо проблемы в моем коде 'models/user.rb'. –

 Смежные вопросы

  • Нет связанных вопросов^_^