Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Создайте новый файл, 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

Ответ 3

Существует множество решений. Для простейшей настройки вы можете использовать script/runner в своем crontab примерно так:

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

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

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

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

Ответ 4

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

Ответ 5

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

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

Итак, чтобы скомпрометировать, мы проверили текстовые файлы с помощью raw cron, аналогично этому:

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

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

Ответ 6

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

URL:

http://your_ip_address:10000/

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