Действительно ли Rails "delayed_job" для задачи cron?

delayed_job находится в http://github.com/collectiveidea/delayed_job

Может ли delayed_job иметь возможность выполнять задачу cron? Например, запуск script каждую ночь в 1 час ночи. Или запустите script каждые 1 час.

Если нет, то какие подходящие камни могут это сделать? И можно ли его удаленно отслеживать с помощью браузера и регистрировать успех и ошибку?

Ответ 1

Я работал над проектом, который пытался использовать DelayedJob для планирования будущих элементов. Он сосал.

Вместо этого я рекомендую использовать камень каждый раз:

http://github.com/javan/whenever

Всякий раз, когда это драгоценный камень Ruby, который обеспечивает ясный синтаксис для определения заданий cron. Он выводит действительный синтаксис cron и может даже напишите свой файл crontab для вас. Он разработан, чтобы хорошо работать с Rails приложений и могут быть развернуты с Capistrano. Всякий раз, когда работает отлично независимо друг от друга.

Код выглядит так (из github)

  every 3.hours do
    runner "MyModel.some_process"
    rake "my:rake:task"
    command "/usr/bin/my_great_command"
  end

  every 1.day, :at => '4:30 am' do
    runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
  end

  every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
    runner "SomeModel.ladeeda"
  end

  every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
    runner "Task.do_something_great"
  end

Здесь RailsCast видео о том, как его использовать.

И соответствующий ASCIICast.

Ответ 2

Я думаю, что cron - лучший инструмент для этого, чем delayed_job. Раньше я использовал его в проекте, и он действительно выделяется при выполнении задачи в фоновом режиме или в определенное время. Но для повторяющихся задач, которые происходят в основное время, я думаю, что cron - лучший инструмент.

Отметьте whenever (и его Railscast), чтобы легко планировать задания cron, которые могут запускать задачи rake (или скрипты, или сценарии оболочки, или что-либо еще.) Вы можете использовать задачи rake для обновления своих моделей, а затем иметь какой-то контроллер панели управления, который смотрит на различные статусы.

Ответ 3

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

https://aaronvb.com/articles/recurring-delayed-job-with-cron.html

Ответ 4

Вы также можете использовать камкордер ClockWork: https://github.com/adamwiggins/clockwork-rails-dj

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

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

Я использовал rake (или runner)/cron/when gem, чтобы запланировать фоновые задачи, но обнаружил, что загрузка моего сервера была настолько высокой, что я постоянно получаю удар, когда rake/runner загружает среду рельсов. Работники Delayed_Job - это ваши рельсовые демоны, которые продолжают работать, поэтому вы постоянно не запускаете Rails каждый раз, когда требуется фоновая задача.

Ответ 5

Всякий раз, когда хорошо работает.

Мне также нравится rufus-scheduler

/config/initializers/task_scheduler.rb

Затем в этом файле:

scheduler = Rufus::Scheduler.start_new  

scheduler.every("1m") do  
   DailyDigest.send_digest!  
end 

Я изначально нашел это сообщение здесь

Я пробовал, и он работает хорошо.

Обновление

Теперь, когда я оглядываюсь на эту ссылку, это в значительной степени единственная компания-рельс, над которой я бы хотел работать. Они сделали несколько драгоценных камней и так много добавили к сообществу. Не говоря уже о том, что у них огромная команда!

Ответ 6

Я создал для этого камень:

https://github.com/sellect/delayed_cron

В настоящее время он работает с sidekiq и delayed_job. Глядя, чтобы добавить resque в ближайшее время. Я знаю, что это немного поздно, но это в значительной степени соответствует тому, что вы искали.