Работа cron для рельсов: лучшие практики? - PullRequest
294 голосов
/ 13 ноября 2008

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

Ответы [ 20 ]

5 голосов
/ 13 ноября 2008

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

http://backgroundrb.rubyforge.org/

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

3 голосов
/ 05 ноября 2015

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

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

require 'clockwork'

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

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

3 голосов
/ 25 октября 2014

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

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

3 голосов
/ 26 января 2009

Вот как я настроил свои задачи 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}"

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

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

whereis ruby # -> ruby: /usr/local/bin/ruby
whereis rake # -> rake: /usr/local/bin/rake
2 голосов
/ 26 августа 2014

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

https://github.com/resque/resque

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

2 голосов
/ 02 апреля 2014

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

1 голос
/ 03 июля 2014

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

1 голос
/ 15 февраля 2013

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

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

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

0 голосов
/ 21 сентября 2017

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

Открыть CronTab -> sudo crontab -e

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

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

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

::CRON FORMAT::

cron format table

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. 

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

0 голосов
/ 13 ноября 2008

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

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

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

...