Вопрос

Каков наилучший способ выполнения запланированных задач в среде Rails?Сценарий / раннер?Грабли?

Это было полезно?

Решение

Я использую грабельный подход (поддерживаемый герой)

С помощью файла под названием lib/tasks/cron.rake ..

task :cron => :environment do
  puts "Pulling new requests..."
  EdiListener.process_new_messages
  puts "done."
end

Для выполнения из командной строки это просто "rake cron".Затем эта команда может быть введена в cron операционной системы / планировщик задач по желанию.

Обновить это довольно старый вопрос и ответ на него!Немного новой информации:

  • служба heroku cron, на которую я ссылался, с тех пор была заменена на Планировщик Heroku
  • для частых задач (особенно.где вы хотите избежать затрат на запуск среды Rails) мой предпочтительный подход заключается в использовании системного cron для вызова скрипта, который либо (а) использует безопасный / частный API webhook для вызова требуемой задачи в фоновом режиме, либо (б) напрямую ставит задачу в очередь в выбранной вами системе массового обслуживания

Другие советы

Я использовал чрезвычайно популярный Всякий раз в проектах, которые сильно зависят от запланированных задач, и это здорово , Это дает вам хороший DSL для определения ваших запланированных задач вместо того, чтобы иметь дело с форматом crontab. С README:

  

Всякий раз, когда драгоценный камень Ruby, который обеспечивает   четкий синтаксис для написания и развертывания   cron вакансии.

Пример из README:

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

В нашем проекте мы впервые использовали gem, но столкнулись с некоторыми проблемами.

Затем мы переключились на RUFUS SCHEDULER , который оказался быть очень простым и надежным для планирования задач в Rails.

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

Код, используемый в этом, похож на:

    require 'rufus-scheduler'

    scheduler = Rufus::Scheduler.new

    scheduler.in '10d' do
      # do something in 10 days
    end

    scheduler.at '2030/12/12 23:30:00' do
      # do something at a given point in time
    end

    scheduler.every '3h' do
      # do something every 3 hours
    end

    scheduler.cron '5 0 * * *' do
      # do something every day, five minutes after midnight
      # (see "man 5 crontab" in your terminal)
    end

Подробнее: https://github.com/jmettraux/rufus-scheduler

Предполагая, что выполнение ваших задач не займет слишком много времени, просто создайте новый контроллер с действием для каждой задачи.Реализуйте логику задачи в виде кода контроллера, затем настройте cronjob на уровне операционной системы, который использует wget для вызова URL этого контроллера и действия через соответствующие промежутки времени.Преимущества этого метода заключаются в том, что вы:

  1. Имейте полный доступ ко всем вашим объектам Rails точно так же, как в обычном контроллере.
  2. Можете разрабатывать и тестировать точно так же, как вы выполняете обычные действия.
  3. Вы также можете вызывать adhoc ваших задач с простой веб-страницы.
  4. Не потребляйте больше памяти, запуская дополнительные процессы ruby / rails.

Проблема с всякий раз, когда (и cron) перезагружается среда rails при каждом ее выполнении, что является реальной проблемой, когда ваши задачи выполняются часто или приходится выполнять много работы по инициализации. У меня были проблемы с производством из-за этого, и я должен предупредить вас.

Планировщик Rufus делает это для меня ( https://github.com/jmettraux/rufus-scheduler )

Когда у меня есть длинные задания, я использую их с delayed_job ( https://github.com/collectiveidea/delayed_job )

Надеюсь, это поможет!

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

задачи script / runner и rake прекрасно подходят для выполнения заданий cron.

Вот одна очень важная вещь, которую вы должны помнить при запуске заданий cron. Они, вероятно, не будут вызываться из корневого каталога вашего приложения. Это означает, что все ваши требования к файлам (в отличие от библиотек) должны выполняться с явным путем: например, File.dirname (__ FILE__) + " / other_file " ;. Это также означает, что вы должны знать, как явно вызывать их из другого каталога: -)

Проверьте, поддерживает ли ваш код запуск из другого каталога с помощью

# from ~
/path/to/ruby /path/to/app/script/runner -e development "MyClass.class_method"
/path/to/ruby /path/to/rake -f /path/to/app/Rakefile rake:task RAILS_ENV=development

Кроме того, задания cron, вероятно, не выполняются как вы, поэтому не зависите от ярлыков, которые вы вставляете в .bashrc. Но это всего лишь стандартный совет cron; -)

Интересно, что никто не упомянул Sidetiq . Это хорошее дополнение, если вы уже используете Sidekiq.

  

Sidetiq предоставляет простой API для определения повторяющихся работников для   Sidekiq.

Работа будет выглядеть так:

class MyWorker
  include Sidekiq::Worker
  include Sidetiq::Schedulable

  recurrence { hourly.minute_of_hour(15, 45) }

  def perform
    # do stuff ...
  end
end

Оба будут работать нормально. Я обычно использую скрипт / бегун.

Вот пример:

0 6 * * * cd / var / www / apps / your_app / current; ./script/runner - среда создания 'EmailSubscription.send_email_subscription' > > /var/www/apps/your_app/shared/log/send_email_subscription.log 2 > & amp; 1

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

Следует иметь в виду, что если память драгоценна, это то, что скрипт / бегун (или задача Rake, зависящая от «окружения») загрузит всю среду Rails. Если вам нужно только вставить некоторые записи в базу данных, это будет использовать память, которая вам на самом деле не нужна. Если вы пишете свой собственный сценарий, вы можете избежать этого. На самом деле мне еще не нужно было это делать, но я обдумываю это.

Используйте Craken (рейк-ориентированные задания cron)

Я использую backgroundrb.

http://backgroundrb.rubyforge.org/

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

Вот как я настроил свои задачи cron. У меня есть один, чтобы делать ежедневные резервные копии базы данных SQL (с помощью rake), а другой - для истечения срока действия кэша раз в месяц. Любой вывод записывается в файл log / cron_log. Мой crontab выглядит так:

crontab -l # command to print all cron tasks
crontab -e # command to edit/add cron tasks

# Contents of crontab
0 1 * * * cd /home/lenart/izziv. whiskas.si/current; /bin/sh cron_tasks >> log/cron_log 2>&1
0 0 1 * * cd /home/lenart/izziv.whiskas.si/current; /usr/bin/env /usr/local/bin/ruby script/runner -e production lib/monthly_cron.rb >> log/cron_log 2>&1

Первая задача cron делает ежедневные резервные копии БД. Содержимое cron_tasks следующее:

/usr/local/bin/rake db:backup RAILS_ENV=production; date; echo "END OF OUTPUT ----";

Вторая задача была настроена позже и использует скрипт / runner для истечения срока действия кэша один раз в месяц (lib / month_cron.rb):

#!/usr/local/bin/ruby
# Expire challenge cache
Challenge.force_expire_cache
puts "Expired cache for Challenges (Challenge.force_expire_cache) #{Time.now}"

Полагаю, я мог бы сделать резервную копию базы данных другим способом, но пока это работает для меня:)

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

whereis ruby # -> ruby: /usr/local/bin/ruby
whereis rake # -> rake: /usr/local/bin/rake

Использование чего-то Sidekiq или Resque - гораздо более надежное решение. Они оба поддерживают повторные задания, эксклюзивность с блокировкой REDIS, мониторинг и планирование.

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

Недавно я создал несколько рабочих мест cron для проектов, над которыми я работал.

Я обнаружил, что самоцвет Заводной очень полезен.

require 'clockwork'

module Clockwork
  every(10.seconds, 'frequent.job')
end

Вы даже можете запланировать фоновую работу, используя этот драгоценный камень. Для получения документации и дополнительной помощи см. https://github.com/Rykian/clockwork

Однажды мне пришлось принять такое же решение, и я действительно доволен этим решением сегодня. Используйте планировщик resque , потому что не только отдельный redis будет снимать нагрузку с вашей базы данных, вы также будете иметь доступ ко многим плагинам, таким как resque-web, который обеспечивает отличный пользовательский интерфейс. По мере развития вашей системы вы будете планировать все больше и больше задач, чтобы вы могли контролировать их из одного места.

вы можете использовать gem resque и resque-shheduler для создания крон, это очень легко сделать.

https://github.com/resque/resque

https://github.com/resque/resque-scheduler

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

Вы можете увидеть очень полезный видео на railscasts

Также взгляните на эти другие ресурсы:

Я использовал часовой механизм , и он отлично работает для меня. Также есть гем clockworkd , позволяющий запускать скрипт как демон.

Я не совсем уверен, полагаю, это зависит от задачи: как часто запускать, насколько сложно и сколько требуется непосредственное общение с проектом rails и т. д. Я предполагаю, что был только " Один из лучших способов сделать что-либо, не было бы так много разных способов сделать это.

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

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

Я использую скрипт для запуска cron, это лучший способ запустить cron. Вот пример для cron,

Откройте CronTab & # 8212; > sudo crontab -e

И вставьте сильфонные линии:

00 00 * * * wget https: // your_host / some_API_end_point

Вот некоторый формат cron, который поможет вам

::CRON FORMAT::

 таблица формата cron

Examples Of crontab Entries
15 6 2 1 * /home/melissa/backup.sh
Run the shell script /home/melissa/backup.sh on January 2 at 6:15 A.M.

15 06 02 Jan * /home/melissa/backup.sh
Same as the above entry. Zeroes can be added at the beginning of a number for legibility, without changing their value.

0 9-18 * * * /home/carl/hourly-archive.sh
Run /home/carl/hourly-archive.sh every hour, on the hour, from 9 A.M. through 6 P.M., every day.

0 9,18 * * Mon /home/wendy/script.sh
Run /home/wendy/script.sh every Monday, at 9 A.M. and 6 P.M.

30 22 * * Mon,Tue,Wed,Thu,Fri /usr/local/bin/backup
Run /usr/local/bin/backup at 10:30 P.M., every weekday. 

Надеюсь, это поможет вам:)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top