Який найкращий спосіб виконувати заплановані завдання в середовищі Rails? Сценарій / бігун? Граблі? Я хотів би виконувати завдання кожні кілька хвилин.
Який найкращий спосіб виконувати заплановані завдання в середовищі Rails? Сценарій / бігун? Граблі? Я хотів би виконувати завдання кожні кілька хвилин.
Відповіді:
Я використовую рейковий підхід (як підтримується heroku )
З файлом, який називається lib / task / cron.rake ..
task :cron => :environment do
puts "Pulling new requests..."
EdiListener.process_new_messages
puts "done."
end
Для виконання з командного рядка це просто "рейка cron". Потім ця команда може бути поміщена в планувальник операцій cron / task за бажанням.
Оновіть це досить старе питання та відповідь! Нова інформація:
load "#{Rails.root}/lib/tasks/cron.rake"
і зробив rake cron
, але отримав NameError: невизначена локальна змінна чи метод `cron 'для main: Object
:environment
залежність. У нас дуже важкий додаток Rails, який запускає багато часу, наш Rake викликається щохвилини і споживає більше ресурсів, запускаючи середовище Rails, яке виконує завдання . Я б хотів, щоб уже запустилося середовище Rails для виклику через cron, повинно бути щось середнє між підходом контролера та режимом рейку .
Я користувався надзвичайно популярним Коли на проекти , які в значній мірі залежать від запланованих завдань, і це здорово. Це дає вам приємний DSL для визначення запланованих завдань замість того, щоб мати справу з форматом crontab. З ПРОЧИТАННЯ:
Щоразу, як це дорогоцінний камінь 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
У нашому проекті ми спочатку використовували щоразу дорогоцінний камінь, але стикалися з деякими проблемами.
Потім ми перейшли на дорогоцінний камінь RUFUS SCHEDULER , який виявився дуже простим і надійним для планування завдань у Rails.
Ми використовували його для надсилання щотижневих та щоденних листів і навіть для виконання деяких періодичних завдань з граблів або будь-якого способу.
Код, використаний у цьому, виглядає так:
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-адреси цього контролера та дії у відповідні інтервали часу. Перевагами цього методу є:
Завдання скрипт / бігун та граблі прекрасно виконуються як 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) полягає в тому, що він перезавантажує середовище рейки щоразу, коли воно виконується, що є справжньою проблемою, коли ваші завдання є частими або мають багато роботи з ініціалізації. У мене виникли проблеми у виробництві через це, і я повинен вас попередити.
Rufus планувальник робить це для мене ( https://github.com/jmettraux/rufus-scheduler )
Коли у мене є тривалі роботи, я використовую її із відкладеною роботою ( https://github.com/collectiveidea/delayed_job )
Я сподіваюся, що це допомагає!
Я великий шанувальник планувальників Resque / Resque . Ви можете не тільки виконувати повторювані завдання, схожі на крон, але й задачі в певний час. Недоліком є те, що для цього потрібен сервер Redis.
Це цікаво, що про 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
І те, і інше буде добре працювати. Зазвичай я використовую сценарій / runner.
Ось приклад:
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, щоб це зробити, якщо ви завантажите потрібні конфігураційні файли для підключення до вашої бази даних.
Одне, що потрібно пам’ятати, якщо пам’ять дорогоцінна, - це те, що сценарій / бігун (або завдання Rake, яке залежить від 'оточення') завантажуватиме все середовище Rails. Якщо вам потрібно лише вставити деякі записи в базу даних, це використовуватиме пам'ять, якої вам не потрібно. Якщо ви пишете власний сценарій, цього можна уникнути. Мені насправді цього ще не потрібно було робити, але я це розглядаю.
Використовуйте Craken (робочі місця, орієнтовані на граблі)
Я використовую backgroundrb.
http://backgroundrb.rubyforge.org/
Я використовую його для виконання запланованих завдань, а також завдань, які займають занадто багато часу для нормальних відносин клієнт / сервер.
Ось, як я налаштував свої завдання на Cron. Я маю щоденно робити резервні копії бази даних SQL (використовуючи граблі), а інший - закінчувати кеш-пам'ять раз на місяць. Будь-який вихід записується у файл файлу / 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 робить щоденні резервні копії db. Вміст cron_tasks такий:
/usr/local/bin/rake db:backup RAILS_ENV=production; date; echo "END OF OUTPUT ----";
Друге завдання було встановлено пізніше і використовує скрипт / бігун, щоб закінчувати кеш-пам'ять раз на місяць (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 запускає кожного працівника в окремий процес.
Нещодавно я створив кілька робочих місць для проектів, над якими працював.
Я виявив, що дорогоцінний камінь Clockwork дуже корисний.
require 'clockwork'
module Clockwork
every(10.seconds, 'frequent.job')
end
Ви навіть можете запланувати своє фонове завдання, використовуючи цей дорогоцінний камінь. Для отримання документації та подальшої допомоги зверніться до https://github.com/Rykian/ clockwork
ви можете використовувати resque
іresque-schedular
дорогоцінний камінь для створення крона, це зробити дуже просто.
Колись мені довелося прийняти те саме рішення, і сьогодні я дуже задоволений цим рішенням. Використовуйте програму- планувальник, оскільки не тільки окремий редис зніме навантаження з вашого db, ви також матимете доступ до багатьох плагінів, як resque-web, який забезпечує чудовий користувальницький інтерфейс. У міру розвитку вашої системи у вас буде все більше завдань для планування, так що ви зможете керувати ними з одного місця.
Мабуть, найкращий спосіб це зробити - використовувати рейку для написання потрібних завдань, а також просто виконати їх за допомогою командного рядка.
Ви можете побачити дуже корисне відео на рейлі
Погляньте також на інші ресурси:
Я не дуже впевнений, я думаю, це залежить від завдання: як часто бігати, наскільки складний і скільки потрібне пряме спілкування з рельсовим проектом і т. Д. Я здогадуюсь, чи був просто "Один найкращий шлях" , щоб зробити що - то , не було б так багато різних способів зробити це.
На моїй останній роботі в проекті Rails нам потрібно було зробити пакетну пошту запрошення (запрошення на опитування, а не спам), яка повинна надсилати заплановану пошту кожного разу, коли сервер встиг. Я думаю, що ми збиралися використовувати інструменти демона для виконання завдань, які я створив.
На жаль, у нашої компанії були деякі проблеми з грошима, і її "купив" головний конкурент, тому проект так і не був завершений, тому я не знаю, чим би ми врешті використали.
Я використовую скрипт для запуску cron, це найкращий спосіб запустити cron. Ось приклад для cron,
Відкрийте CronTab -> sudo crontab -e
І вставити рядки нижче:
00 00 * * * wget https: // your_host / some_API_end_point
Ось якийсь формат кронів, вам допоможе
::CRON FORMAT::
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.
Сподіваюся, це допоможе вам :)