Задание крона для направляющих: лучшие практики?

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

294
задан not a patch 7 October 2019 в 12:41
поделиться

8 ответов

Я использую метод грабли (поддерживается heroku )

С файлом 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 Scheduler
  • для часто выполняемых задач (особенно. где вы хотите избежать затрат на запуск среды Rails), я предпочитаю использовать системный cron для вызова сценария, который либо (а) запускает безопасный / частный API-интерфейс веб-перехватчика для вызова требуемой задачи в фоновом режиме, либо (б) напрямую ставит в очередь задача в выбранной системе очередей
110
ответ дан 23 November 2019 в 01:36
поделиться

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

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

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

0
ответ дан Jay Modi 23 November 2019 в 01:36
поделиться

Вот то, как я имею, устанавливают мои задачи крона. У меня есть для создания ежедневных резервных копий базы данных SQL (использующий грабли) и другой для истечения кэша один раз в месяц. Любой вывод зарегистрирован файл 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_tasks следующее:

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

второй задачей была установка позже и сценарий/бегун использования для истечения кэша один раз в месяц (lib/monthly_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
3
ответ дан 23 November 2019 в 01:36
поделиться

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

http://backgroundrb.rubyforge.org/

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

5
ответ дан salt.racer 23 November 2019 в 01:36
поделиться

Оба будут хорошо работать. Я обычно использую сценарий/бегуна.

Вот пример:

0 6 * * * cd /var/www/apps/your_app/current; ./script/runner --environment production 'EmailSubscription.send_email_subscriptions' >> /var/www/apps/your_app/shared/log/send_email_subscriptions.log 2>&1

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

Одна вещь иметь в виду, драгоценна ли память, состоит в том, что сценарий/бегун (или задача Граблей, которая зависит от 'среды') загрузит всю среду направляющих. Если только необходимо вставить некоторые записи в базу данных, это будет использовать память, к которой Вы действительно не имеете. Если Вы пишете свой собственный сценарий, можно избежать этого. Я еще не должен был на самом деле делать этого, но я рассматриваю его.

8
ответ дан Luke Francl 23 November 2019 в 01:36
поделиться

сценарий/бегун и задачи граблей прекрасно подходят для выполнения как задания крона.

Вот одна очень важная вещь, которую необходимо помнить когда рабочие задания крона. Их, вероятно, не назовут от корневого каталога Вашего приложения. Это означает, что все Ваш требуют для файлов (в противоположность библиотекам), должен быть сделан с явным путем: например, File.dirname (__ ФАЙЛ __) + "/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

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

10
ответ дан webmat 23 November 2019 в 01:36
поделиться

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

  1. Имеют полный доступ ко всем Вашим объектам направляющих так же, как в нормальном контроллере.
  2. Может разработать и протестировать так же, как Вы делаете нормальные действия.
  3. Может также вызвать Ваши задачи для данного случая от простой веб-страницы.
  4. больше не используют память путем разжигания дополнительных процессов рубина/направляющих.
17
ответ дан the Tin Man 23 November 2019 в 01:36
поделиться

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

8
ответ дан Thibaut Barrère 23 November 2019 в 01:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: