2012-03-23 19 views
21

मैं Heroku अनुसूचक ऐड-ऑन सफलतापूर्वक दैनिक नौकरियों के लिए काम के साथ Heroku पर तैनात एक रेल एप्लिकेशन है।मैं हेरोोकू पर 'साप्ताहिक' नौकरी कैसे निर्धारित कर सकता हूं?

अब मुझे साप्ताहिक नौकरी चाहिए, लेकिन शेड्यूलर ऐड-ऑन मुझे साप्ताहिक विकल्प की अनुमति नहीं देता है।

मैं यह कैसे हासिल कर पर कोई सुझाव:

  • मैंने पहले भी Rufus-अनुसूचक का उपयोग कर की कोशिश की है, लेकिन यह मुझे कुछ समस्याओं के कारण, ताकि एक विकल्प नहीं है। विस्तार के लिए here देखें।
  • मैं एक दैनिक काम के भीतर मौजूदा दिन के लिए जाँच की तर्ज पर कुछ के बारे में सोच रहा हूँ। क्या किसी ने कोशिश की है और दृष्टिकोण के साथ मुद्दों के बारे में प्रतिक्रिया या जानकारी है?
  • अन्य विचारों की बहुत सराहना।

उत्तर

35

एक दृष्टिकोण अपने 2 बुलेट बिंदु में से एक होगा:

को सक्रिय Heroku क्रॉन ऐड-ऑन, और app/lib/tasks

में एक cron.rake कार्य जोड़ने के सक्रिय Heroku अनुसूचक ऐड-ऑन , और app/lib/tasks

task :your_weekly_task=> :environment do 
    if Time.now.friday? # previous answer: Date.today.wday == 5 
    #do something 
    end 
end 

में एक scheduler.rake कार्य जोड़ने तुम भी दिन आप आप चाहते हैं परिभाषित करने की विलासिता है आर कार्य चलाने के लिए; ओ) (5 शुक्रवार के लिए है)

संपादित करें: वैसे, क्रॉन को बहिष्कृत किया गया है और हेरोोकू अपने शेड्यूलर ऐड-ऑन पर स्विच करने की सिफारिश करता है। हालांकि यह साप्ताहिक नौकरी के लिए दृष्टिकोण नहीं बदलता है।

EDIT2: मेरा उत्तर sunkencity से प्रतिक्रिया के आधार पर करने के लिए समायोजन।

+3

क्रॉन ऐड-ऑन को बहिष्कृत किया गया है और शेड्यूलर के पक्ष में बंद कर दिया जाएगा। उस ने कहा, आपके द्वारा सुझाए गए दृष्टिकोण ध्वनि हैं, लेकिन इसे सक्रिय समर्थन के साथ बेहतर बनाया जा सकता है: Time.now.friday? – sunkencity

+0

मैं दिन को कड़ी-कोडिंग के विचार पर चिल्ला रहा हूं, इसलिए मैं अब बेहतर विकल्प के लिए प्रश्न खोल दूंगा। –

+0

बीटीडब्ल्यू, मैं क्या करता हूं कि मैं सप्ताह के दिन चलाने के लिए एक heroku config var का उपयोग करता हूं। फिर आपको यूआई के माध्यम से दिन के समय को नियंत्रित करना होगा। यह वास्तव में * महान * नहीं है। हेरोोकू टीम, यदि आप वहां हैं और इसे पढ़ते हैं, तो कृपया शेड्यूलर को बेहतर बनाएं। इसमें क्रॉन की सभी लचीलापन नहीं है। लेकिन, कम से कम इसे बनाएं जहां आप साप्ताहिक और मासिक नौकरियां निर्धारित कर सकते हैं। –

8

यह आदर्श नहीं है, लेकिन मैं कार्यों Heroku के माध्यम से चलाने रेक करने के लिए एक RUN_IF वातावरण चर जोड़ने के लिए निकाल दिया है: अनुसूचक जो नौकरियों के लिए मुझे साप्ताहिक और मासिक कार्यक्रम की सुविधा देता है।

# lib/tasks/scheduler.rake 
def run? 
    eval ENV.fetch('RUN_IF', 'true') 
end 

def scheduled 
    if run? 
    yield 
    else 
    puts "RUN_IF #{ENV['RUN_IF'].inspect} eval'd to false: aborting job." 
    end 
end 

# lib/tasks/job.rake 
task :job do 
    scheduled do 
    # ... 
    end 
end 

यदि कोई रेक कार्य RUN_IF चर के बिना चलाया जाता है तो यह चलाएगा। अन्यथा, नौकरी निरस्त कर दी जाएगी जब तक कि RUN_IF का मान एक गलत मूल्य के लिए evals।

$ rake job        # => runs always 
$ rake job RUN_IF='Date.today.monday?' # => only runs on Mondays 
$ rake job RUN_IF='Date.today.day == 1' # => only runs on the 1st of the month 
$ rake job RUN_IF='false'    # => never runs (not practical, just demonstration) 

उपर्युक्त अन्य विचारों के समान, लेकिन मैं शेड्यूलिंग विवरण को एप्लिकेशन कोड से बाहर ले जाना पसंद करता हूं।

#!/bin/bash 

cmd="echo your schedule job here" 

# Only run on even days 
ruby -e 'if Time.now.utc.day.even?; puts "Not today!"; exit 1; end' && $cmd "[email protected]" 

इस गैर माणिक परियोजनाओं के लिए भी काम करता है (मेरे मामले में के रूप में:

+0

ग्रेट सॉल्यूशन! – bnussey

0

आप नहीं चाहते या रैक के साथ ऐसा नहीं कर सकते हैं, तो एक और विकल्प बैश से रूबी के साथ ऐसा करना है Clojure)।

9

केवल खोल कोड का उपयोग कर एक वैकल्पिक विकल्प।

# setting the schedular to run hourly at *:30 is equivalent to the 
# crondate: 30 8 * * 1 
if [ "$(date +%H)" = 08 ] && [ "$(date +%d)" = 01 ]; then YOUR_COMMAND ; fi 

मैं अपने स्थानीय समय क्षेत्र में क्रॉन नकल करने के लिए इस कोड का उपयोग किया है:: सेटअप Heroku अनुसूचक प्रति घंटा, और तारीख आदेश के खिलाफ एक तुलना करना

nz_hour="$(TZ=NZ date +%H)" ; nz_day="$(TZ=NZ date +%d)" ; if [ "$nz_hour" = 08 ] && [ "$nz_day" = 01 ]; then YOUR_COMMAND ; fi 
1

जैसा कि बताया जा over here, और का उपयोग कर रोब से उपर्युक्त तर्क, यहां सप्ताह के एक दिन, महीने में एक बार, और एक विशिष्ट तिथि पर टूटने वाली बैश स्क्रिप्ट हैं। किसी कार्य को हर 1 दिन एक महीने में

if [ "$(date +%u)" = 1 ]; then MY_COMMAND; fi 

चलाएँ:: एक नौकरी के लिए हर साल

if [ "$(date +%d)" = 01 ]; then MY_COMMAND; fi 

तुम भी चला सकते हैं 24 दिसंबर को:

एक काम चलाने के लिए हर सोमवार

if [ "$(date +%m)" = 12 ] && [ "$(date +%d)" = 24 ]; then MY_COMMAND; fi 
संबंधित मुद्दे