سؤال

ما هي أفضل طريقة لتشغيل المهام المجدولة في بيئة ريلز؟السيناريو / عداء؟مجرفة؟

هل كانت مفيدة؟

المحلول

أنا أستخدم نهج أشعل النار (كما هو مدعوم من Heroku)

باستخدام ملف يسمى lib/tasks/cron.rake ..

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

للتنفيذ من سطر الأوامر، هذا مجرد "Rake cron".يمكن بعد ذلك وضع هذا الأمر على برنامج جدولة المهام/الكرون لنظام التشغيل حسب الرغبة.

تحديث هذا سؤال وجواب قديم جدًا!بعض المعلومات الجديدة:

  • تم استبدال خدمة Heroku cron التي أشرت إليها منذ ذلك الحين بـ جدولة هيروكو
  • للمهام المتكررة (خاصة.عندما تريد تجنب تكلفة بدء تشغيل بيئة Rails) الأسلوب المفضل لدي هو استخدام نظام cron لاستدعاء برنامج نصي إما (أ) يضغط على واجهة برمجة تطبيقات webhook آمنة/خاصة لاستدعاء المهمة المطلوبة في الخلفية أو (ب) يدرج مباشرة في قائمة الانتظار مهمة على نظام الانتظار الخاص بك في الاختيار

نصائح أخرى

في مشروعنا استخدمنا الأحجار الكريمة لأول مرة، ولكن واجهنا بعض المشاكل.

ثم تحولنا إلى جدول روفوس Gem، والتي تبين أنها سهلة جدًا وموثوقة لجدولة المهام في 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 لوحدة التحكم هذه والإجراء على فترات زمنية مناسبة.ومن مميزات هذه الطريقة أنك:

  1. تمتع بالوصول الكامل إلى جميع كائنات Rails الخاصة بك تمامًا كما هو الحال في وحدة التحكم العادية.
  2. يمكن تطويره واختباره تمامًا كما تفعل مع الإجراءات العادية.
  3. يمكن أيضًا استدعاء مهامك المخصصة من صفحة ويب بسيطة.
  4. لا تستهلك المزيد من الذاكرة عن طريق تشغيل عمليات روبي/ريلز إضافية.

والمشكلة مع كلما (وكرون) هو أنه تعيد تحميل البيئة القضبان في كل مرة يتم تنفيذه، وهي مشكلة حقيقية عندما المهام الخاصة بك متكررة أو لديهم الكثير من العمل للقيام التهيئة. لقد كان لي مشاكل في الإنتاج بسبب هذا، ويجب تحذير لك.

وروفوس جدولة يفعل ذلك بالنسبة لي ( https://github.com/jmettraux/rufus-scheduler )

وعندما يكون لدي عمل طويلة للتشغيل، I استخدامه مع delayed_job ( https://github.com/collectiveidea/delayed_job )

وآمل أن يساعد هذا!

وأنا معجب كبير من resque / <لأ href = "https://github.com/bvandenbos/resque -scheduler "> resque جدولة . لا يمكنك فقط تشغيل تكرار المهام مثل كرون ولكن أيضا المهام في أوقات محددة. الجانب السلبي هو، فإنه يتطلب الخادم رديس.

والنصي / عداء وأشعل النار المهام على ما يرام تماما لتشغيل وظيفة كرون.

وهنا شيء واحد مهم جدا يجب أن نتذكر عند تشغيل وظيفة كرون. أنها ربما لن يتم استدعاؤها من الدليل الجذر من التطبيق الخاص بك. وهذا يعني كل يتطلب الخاص بك لملفات (على العكس من المكتبات) وينبغي أن يتم مع مسار واضح: على سبيل المثال 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

وأيضا، وظائف كرون ربما لا تعمل كما كنت، لذلك لا تعتمد على أي اختصار كنت وضعت في .bashrc. ولكن هذا مجرد غيض كرون القياسية؛ -)

وهذا هو المثير للاهتمام لا أحد ذكر 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 --environment production 'EmailSubscription.send_email_subscriptions' >> /var/www/apps/your_app/shared/log/send_email_subscriptions.log 2>&1

ويمكنك أيضا كتابة السيناريو نقية روبي إلى القيام بذلك إذا قمت بتحميل ملفات التهيئة الصحيحة للاتصال بقاعدة البيانات الخاصة بك.

وشيء واحد أن نأخذ في الاعتبار إذا الذاكرة الثمينة هو أن السيناريو / عداء (أو مهمة الخليع الذي يعتمد على 'بيئة') سيتم تحميل بيئة القضبان بأكملها. إذا كنت بحاجة فقط لادخال بعض السجلات في قاعدة البيانات، وهذا سوف تستخدم الذاكرة لم يكن لديك حقا. إذا كنت كتابة السيناريو الخاص بك، يمكنك تجنب هذا. لقد يست هناك حاجة فعلا للقيام بذلك بعد، ولكن أنا أفكر في ذلك.

Craken (وأشعل النار وظائف مركزية كرون)

وأنا استخدم backgroundrb.

http://backgroundrb.rubyforge.org/

وأنا استخدامها لتشغيل المهام المجدولة وكذلك المهام التي تستغرق وقتا طويلا جدا للعلاقة العميل / الخادم العادية.

وفيما يلي كيفية لدي الإعداد مهام كرون بلدي. أنا واحد لجعل النسخ الاحتياطي اليومي من قاعدة بيانات SQL (باستخدام أشعل النار)، وأخرى لتنتهي مخبأ مرة واحدة في الشهر. يتم تسجيل أي الإخراج في ملف السجل / cron_log. بلدي كرونتاب يبدو مثل هذا:

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 ----";

وكانت المهمة الثانية في وقت لاحق الإعداد ويستخدم النصي / عداء لتنتهي مخبأ مرة واحدة في الشهر (ليب / 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

واستعمال ما Sidekiq أو Resque هو حل أكثر قوة بكثير. كلاهما وظائف دعم إعادة المحاولة، التفرد مع REDIS قفل، والرصد، وتحديد مواعيد.

ونضع في اعتبارنا أن Resque هو مشروع ميت (لا يتم الاحتفاظ بنشاط)، لذلك Sidekiq هو وسيلة أفضل بديل. كما أنها أكثر performant لل: Sidekiq تدير العديد من العمال في عملية واحدة، مولتيثريد أثناء تشغيل Resque كل عامل في عملية منفصلة

لقد قمت مؤخرًا بإنشاء بعض وظائف cron للمشاريع التي كنت أعمل عليها.

لقد وجدت تلك الجوهرة تصورها مفيد جدا.

require 'clockwork'

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

يمكنك أيضًا جدولة مهمة الخلفية الخاصة بك باستخدام هذه الأحجار الكريمة.للحصول على الوثائق ومزيد من المساعدة الرجوع https://github.com/Rykian/clockwork

ذات مرة كان علي أن أتخذ نفس القرار وأنا سعيد حقًا بهذا القرار اليوم.يستخدم جدولة resque نظرًا لأن redis المنفصل لن يقوم فقط بإزالة التحميل من قاعدة البيانات الخاصة بك، بل سيكون لديك أيضًا إمكانية الوصول إلى العديد من المكونات الإضافية مثل resque-web الذي يوفر واجهة مستخدم رائعة.مع تطور نظامك، سيكون لديك المزيد والمزيد من المهام لجدولتها حتى تتمكن من التحكم فيها من مكان واحد.

ويمكنك استخدام resque وresque-shheduler جوهرة لخلق crons، وهذا من السهل جدا القيام به.

https://github.com/resque/resque

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

ربما تكون أفضل طريقة للقيام بذلك هي استخدام rake لكتابة المهام التي تحتاجها وتنفيذها فقط عبر سطر الأوامر.

تستطيع أن ترى مفيدة للغاية الفيديو في السكك الحديدية

ألقِ نظرة أيضًا على هذه الموارد الأخرى:

تصورها الأحجار الكريمة، وأنه يعمل بشكل جيد بالنسبة لي. وهناك أيضا جوهرة clockworkd الذي يسمح برنامج نصي لتشغيل كما الخفي.

ولست متأكدا حقا، وأنا أعتقد أن ذلك يعتمد على المهمة: عدد مرات تشغيل، وكم تعقيدا ومدى التواصل المباشر مع مشروع السكك الحديدية هو مطلوب وما أنا أعتقد إذا كان هناك فقط <م> "واحد أفضل طريقة " أن تفعل شيئا، لن يكون هناك العديد من الطرق المختلفة للقيام بذلك.

وفي وظيفتي الماضي في مشروع القضبان، نحن بحاجة لجعل الارسال دعوة دفعة (دعوات المسح، إغراق) والتي ينبغي أن ترسل رسائل المخطط كلما كان خادم الوقت. أعتقد أننا ذاهبون إلى استخدام أدوات الخفي لتشغيل المهام أشعل النار أنا قد خلقت.

ولسوء الحظ، كانت شركتنا بعض المشاكل المال و"اشترت" من قبل المنافس الرئيسي لذلك تم الانتهاء من المشروع أبدا، لذلك أنا لا أعرف ما كنا في نهاية المطاف قد استخدمت.

وأنا استخدم البرنامج النصي لتشغيل كرون، وهذا هو أفضل وسيلة لتشغيل كرون. وفيما يلي بعض الأمثلة لكرون،

فتح كرونتاب -> سودو كرونتاب -e

ولصق خطوط بيلو:

و00 00 * * * مجلد مشترك 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. 

وهذا الأمل سوف تساعدك على:)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top