रेल के वातावरण में अनुसूचित कार्यों को चलाने का सबसे अच्छा तरीका क्या है? स्क्रिप्ट / धावक? रैक? मैं हर कुछ मिनट में काम चलाना चाहूंगा।
रेल के वातावरण में अनुसूचित कार्यों को चलाने का सबसे अच्छा तरीका क्या है? स्क्रिप्ट / धावक? रैक? मैं हर कुछ मिनट में काम चलाना चाहूंगा।
जवाबों:
मैं रेक एप्रोच का उपयोग कर रहा हूँ (जैसा कि हर्को द्वारा समर्थित है )
Lib / कार्यों / cron.rake नामक फ़ाइल के साथ।
task :cron => :environment do
puts "Pulling new requests..."
EdiListener.process_new_messages
puts "done."
end
कमांड लाइन से निष्पादित करने के लिए, यह सिर्फ "रेक क्रोन" है। फिर यह कमांड वांछित के रूप में ऑपरेटिंग सिस्टम क्रोन / टास्क शेड्यूलर पर रखी जा सकती है।
अद्यतन यह एक पुराना सवाल और जवाब है! कुछ नई जानकारी:
load "#{Rails.root}/lib/tasks/cron.rake"
और किया rake cron
, लेकिन नाम लिया गया नाम: अपरिभाषित स्थानीय चर या विधि `क्रोन 'मुख्य के लिए: वस्तु
:environment
निर्भरता है। हमारे पास एक बहुत भारी रेल एप्लिकेशन है जिसे शुरू होने में लंबा समय लगता है, हमारे रेक को हर मिनट कहा जाता है और रेल के वातावरण को शुरू करने वाले अधिक संसाधनों का उपभोग करते हैं जो कार्य को अंजाम दे रहे हैं । मुझे क्रॉन के माध्यम से बुलाए जाने के लिए पहले से ही शुरू किए गए रेल वातावरण से प्यार है , नियंत्रक दृष्टिकोण और एक पर्यावरण के बीच कुछ होना चाहिए ।
मैंने जब भी परियोजनाओं पर अत्यधिक लोकप्रिय का उपयोग किया है जो निर्धारित कार्यों पर बहुत अधिक निर्भर करते हैं, और यह बहुत अच्छा है। यह आपको कॉस्टैब प्रारूप से निपटने के बजाय अपने निर्धारित कार्यों को परिभाषित करने के लिए एक अच्छा डीएसएल देता है। README से:
जब भी कोई रूबी रत्न होता है जो क्रोन नौकरियों को लिखने और तैनात करने के लिए एक स्पष्ट वाक्यविन्यास प्रदान करता है।
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 मणि पर स्विच किया , जो रेल में शेड्यूलिंग कार्यों के लिए बहुत आसान और विश्वसनीय निकला।
हमने साप्ताहिक और दैनिक मेल भेजने के लिए, और यहां तक कि कुछ आवधिक रेक कार्यों या किसी भी विधि को चलाने के लिए इसका उपयोग किया है।
इसमें इस्तेमाल किया गया कोड इस प्रकार है:
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
अपने कार्यों को पूरा करने में बहुत लंबा समय नहीं लगता है, बस प्रत्येक कार्य के लिए एक कार्रवाई के साथ एक नया नियंत्रक बनाएं। नियंत्रक कोड के रूप में कार्य के तर्क को लागू करें, फिर ओएस स्तर पर एक क्रोनजोब स्थापित करें जो उचित समय के अंतराल पर इस नियंत्रक और कार्रवाई के URL को लागू करने के लिए उपयोग करता है। इस विधि के फायदे हैं:
स्क्रिप्ट / रनर और रेक कार्य क्रोन जॉब्स के रूप में चलाने के लिए पूरी तरह से ठीक हैं।
यहाँ एक बहुत महत्वपूर्ण बात है जो आपको याद रखनी चाहिए जब आप क्रोन जॉब्स चलाते हैं। संभवत: उन्हें आपके ऐप की रूट डायरेक्टरी से नहीं बुलाया जाएगा। इसका मतलब है कि आपकी सभी फ़ाइलों के लिए (पुस्तकालयों के विपरीत) स्पष्ट मार्ग के साथ किया जाना चाहिए: जैसे 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 में डाले गए किसी भी शॉर्टकट पर निर्भर न हों। लेकिन यह सिर्फ एक मानक क्रोन टिप है ;-)
जब भी (और क्रोन) समस्या यह है कि यह हर बार निष्पादित होने पर रेल के वातावरण को फिर से लोड करता है, जो कि एक वास्तविक समस्या है जब आपके कार्य अक्सर होते हैं या करने के लिए बहुत सारे आरंभीकरण कार्य होते हैं। मेरे पास इसके कारण उत्पादन में मुद्दे हैं और आपको चेतावनी देनी चाहिए।
Rufus अनुसूचक यह मेरे लिए करता है ( https://github.com/jmettraux/rufus-scheduler) )
जब मेरे पास दौड़ने के लिए लंबी नौकरियां हों, तो मैं इसे देरी से_बॉज ( https://github.com/collectiveidea/delayb_job) के साथ उपयोग करता हूं ) के
आशा है कि ये आपकी मदद करेगा!
मैं resque / resque अनुसूचक का बहुत बड़ा प्रशंसक हूं । आप न केवल क्रोन जैसे कार्यों को दोहरा सकते हैं, बल्कि विशिष्ट समय पर कार्य भी कर सकते हैं। नकारात्मक पक्ष यह है कि इसमें एक रेडिस सर्वर की आवश्यकता होती है।
यह दिलचस्प है कि किसी ने भी सिडिटक का उल्लेख नहीं किया । यदि आप पहले से ही साइडकीक का उपयोग कर रहे हैं तो यह अच्छा है।
साइडिटक के लिए आवर्ती श्रमिकों को परिभाषित करने के लिए सिद्दीक एक सरल एपीआई प्रदान करता है।
नौकरी इस तरह दिखेगा:
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
यदि आप अपने डेटाबेस से कनेक्ट करने के लिए सही कॉन्फ़िग फ़ाइल लोड करते हैं, तो ऐसा करने के लिए आप एक शुद्ध-रूबी स्क्रिप्ट भी लिख सकते हैं।
एक बात ध्यान में रखें कि यदि स्मृति कीमती है, तो वह स्क्रिप्ट / रनर (या 'पर्यावरण' पर निर्भर एक रेक कार्य) पूरे रेल वातावरण को लोड करेगा। यदि आपको केवल डेटाबेस में कुछ रिकॉर्ड सम्मिलित करने की आवश्यकता है, तो यह मेमोरी का उपयोग करेगा जो आपके पास वास्तव में नहीं है। यदि आप अपनी स्क्रिप्ट लिखते हैं, तो आप इससे बच सकते हैं। मुझे वास्तव में अभी तक ऐसा करने की आवश्यकता नहीं है, लेकिन मैं इस पर विचार कर रहा हूं।
क्रेकेन (रेक सेंट्रिक क्रॉन जॉब्स) का उपयोग करें
मैं बैकग्राउंड का इस्तेमाल करता हूं।
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
पहला क्रोन कार्य दैनिक db बैकअप बनाता है। Cron_tasks की सामग्री निम्नलिखित हैं:
/usr/local/bin/rake db:backup RAILS_ENV=production; date; echo "END OF OUTPUT ----";
दूसरा कार्य बाद में सेटअप किया गया था और महीने में एक बार कैश समाप्त करने के लिए स्क्रिप्ट / रनर का उपयोग करता है (lib / मासिक_क्रोन.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
कुछ साइडकीक या रेस्क्यू का उपयोग करना कहीं अधिक मजबूत समाधान है। वे दोनों रिटायरिंग जॉब्स, REDIS लॉक के साथ विशिष्टता, निगरानी और समय-निर्धारण का समर्थन करते हैं।
ध्यान रखें कि रेसक्यू एक मृत परियोजना है (सक्रिय रूप से बनाए नहीं रखा गया है), इसलिए साइडकीक एक बेहतर विकल्प है। यह अधिक प्रदर्शन करने वाला भी है: साइडकीक एक सिंगल, मल्टीथ्रेड प्रक्रिया पर कई श्रमिकों को चलाता है जबकि रेस्क प्रत्येक कार्यकर्ता को एक अलग प्रक्रिया में चलाता है।
मैंने हाल ही में जिन परियोजनाओं पर काम किया है, उनके लिए कुछ क्रॉन जॉब्स बनाए हैं।
मैंने पाया कि मणि घड़ी की कल बहुत उपयोगी है।
require 'clockwork'
module Clockwork
every(10.seconds, 'frequent.job')
end
तुम भी इस मणि का उपयोग कर अपनी पृष्ठभूमि नौकरी अनुसूची कर सकते हैं। प्रलेखन और आगे की मदद के लिए https://github.com/Rykian/clockwork देखें
आप क्रोन बनाने के लिए उपयोग resque
और resque-schedular
मणि कर सकते हैं , यह करना बहुत आसान है।
एक बार मुझे भी यही निर्णय लेना पड़ा और मैं आज उस फैसले से वास्तव में खुश हूं। रेस्क्यू शेड्यूलर का उपयोग करें क्योंकि न केवल एक अलग रेडिस आपके डीबी से लोड को बाहर निकालेगा, आपके पास रिसक-वेब जैसे कई प्लगइन्स तक पहुंच भी होगी जो एक महान उपयोगकर्ता इंटरफ़ेस प्रदान करता है। जैसे ही आपका सिस्टम विकसित होता है, आपके पास शेड्यूल करने के लिए अधिक से अधिक कार्य होंगे ताकि आप उन्हें एक ही स्थान से नियंत्रित कर पाएंगे।
संभवतः ऐसा करने का सबसे अच्छा तरीका यह है कि आप जिन कार्यों की ज़रूरत है उन्हें लिखने के लिए रेक का उपयोग करें और बस इसे कमांड लाइन के माध्यम से निष्पादित करें।
आप बहुत मददगार देख सकते हैं railscasts में वीडियो
इसके अलावा इस अन्य संसाधनों पर एक नज़र डालें:
मुझे वास्तव में यकीन नहीं है, मुझे लगता है कि यह कार्य पर निर्भर करता है: कितनी बार चलना है, रेल परियोजना के साथ कितना जटिल और कितना सीधा संचार की आवश्यकता है आदि। मुझे लगता है कि अगर सिर्फ "एक सबसे अच्छा तरीका" था कुछ करने के लिए था , ऐसा करने के लिए कई अलग-अलग तरीके नहीं होंगे।
रेल परियोजना में मेरी आखिरी नौकरी में, हमें एक बैच आमंत्रण मेलर (सर्वेक्षण आमंत्रण, स्पैमिंग नहीं) बनाने की आवश्यकता थी, जो कि सर्वर के पास जब भी योजना बनाई मेल भेजनी चाहिए। मुझे लगता है कि हम अपने द्वारा बनाए गए रेक कार्यों को चलाने के लिए डेमन टूल्स का उपयोग करने जा रहे थे ।
दुर्भाग्य से, हमारी कंपनी को कुछ पैसे की समस्या थी और मुख्य प्रतिद्वंद्वी द्वारा "खरीदा" गया था, इसलिए परियोजना कभी पूरी नहीं हुई थी, इसलिए मुझे नहीं पता कि हम अंततः क्या उपयोग करेंगे।
मैं क्रोन चलाने के लिए स्क्रिप्ट का उपयोग करता हूं, जो क्रोन चलाने का सबसे अच्छा तरीका है। यहाँ क्रोन के लिए कुछ उदाहरण है,
ओपन क्रोनटैब -> सुडो क्रॉस्टैब-ई
और चिपकाएँ पंक्तियाँ:
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.
आशा है कि यह आपकी मदद करेगा :)