Повторяющиеся задачи в приложении Ruby On Rails: Cron или другое? - PullRequest
16 голосов
/ 17 января 2010

В настоящее время я пишу приложение, которое извлекает новую информацию из источников RSS и должно обновлять эти источники RSS с определенной частотой.В настоящее время я выполняю запрос только тогда, когда пользователь запрашивает фид, но я хочу изменить это поведение на автоматическую периодическую выборку.

Я писал сценарий оболочки, который взаимодействовал бы с базой данных и периодически запускался через cron - но этомного двойных усилий, поэтому мне было интересно, каким будет "Rails Way" или "Ruby Way", чтобы сделать это.Я использую Ubuntu, Apache и Passenger.Можете ли вы предложить более эффективные методы, которые, возможно, даже включены в приложение, чтобы я мог легко развернуть приложение на другом компьютере без необходимости смешиваться с cron?

Ответы [ 6 ]

19 голосов
/ 17 января 2010

Я бы предложил сделать что-то вроде задачи rake и использовать всякий раз, когда gem , чтобы сгенерировать задание cron для запуска задачи rake.

Проверьте, http://railscasts.com/episodes/164-cron-in-ruby, для получения дополнительной информации о драгоценном камере.

Основным преимуществом всякий раз, когда gem является то, что он поддерживает требования вашего приложения (то есть, задание cron, выполняемое каждые x часов в приложении) внутри вашего приложения, увеличивая мобильность вашего приложения. *

6 голосов
/ 17 января 2010

Я рекомендую комбинацию из двух выше. Вы хотите выполнить грабли, даже если у вас уже есть прямой метод. Это связано с тем, что администратор сервера может запускать cron, а также иногда запускать его из командной строки, и для этого хороши задачи rake.

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

Создать новый файл, lib/tasks/admin.rake

Внутри создайте само задание:

namespace :admin
  desc "Updates all RSS feeds"
  task :rss => :environment do
    RssFeed.update_all
  end
end

Это предполагает, что у вас есть класс RssFeed, а метод update_all делает то, что вы ожидаете. Вы можете вызвать это из командной строки:

rake admin:rss

И вы можете добавить это в cron (позвонив crontab -l как веб-пользователь) и добавив эту строку:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss
1 голос
/ 18 января 2010

Попробуйте использовать всякий раз, когда . Несмотря на то, что в конце концов он создаст cron, но определение расписания будет записано внутри вашего приложения с использованием Ruby DSL.

1 голос
/ 17 января 2010

Есть множество решений. Для простейшей настройки вы можете использовать script/runner в вашем crontab что-то вроде этого:

10 0 * * * /home/myuser/myproject/script/runner -e production ModelName.methodname

Имя метода должно быть статическим методом в вашей модели. Вы должны ссылаться на проект по полному пути, иначе он не будет найден наиболее вероятно в среде cron. Проверьте вашу справочную страницу crontab для получения информации о синтаксисе crontab, если вы не знакомы. Например, приведенное выше запускает сценарий на 10-й минуте 0-го часа каждого дня (короче в 0:10).

Если вам нужно более мощное решение, вы можете использовать BackgroundRB . BackgroundRB запускает демон и поддерживает запланированные задачи и может помещать результаты в базу данных. У них даже есть простой протокол связи, позволяющий вашим веб-процессам запрашивать выполнение задачи, а затем получить способ получить результат. Это позволяет вам управлять фоновыми заданиями прямо из веб-интерфейса, а не crontab, который просто «происходит».

Для работы BackroundRB требуется немного больше настроек, но, возможно, оно того стоит, если нужно контролировать работу.

0 голосов
/ 25 марта 2013

Попробуйте установить webmin на вашем сервере. Если ваш хостинг сайт предоставит. Перейдите по указанному ниже URL. Его легко настроить и использовать бесплатно.

URL-адрес:

http://your_ip_address:10000/

Я использовал это во многих своих приложениях, и это помогло мне планировать задания cron.

0 голосов
/ 18 января 2010

Для небольших команд и личных проектов, каждый раз, когда драгоценный камень велик. Но если в вашей компании есть рабочая группа, отделенная от команды разработчиков, это может быть не идеально.

На моей последней работе оперативная команда должна была иметь возможность видеть устанавливаемый нами хрон, чтобы они могли быть уверены, что у системы не будет побочных эффектов. Таким образом, решение DSL не сработало. Но мы (разработчики) хотели использовать скрипты cron для контроля версий.

Итак, чтобы пойти на компромисс, мы проверили текстовые файлы с необработанным хроном, подобным этому:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss

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

...