मैं कैसे अटक / बासी Resque श्रमिकों को साफ करूं?


132

जैसा कि आप संलग्न छवि से देख सकते हैं, मुझे कुछ कार्यकर्ता मिले हैं जो अटके हुए प्रतीत होते हैं। उन प्रक्रियाओं को कुछ सेकंड से अधिक समय नहीं लेना चाहिए।

यहाँ छवि विवरण दर्ज करें

मुझे यकीन नहीं है कि वे स्पष्ट क्यों नहीं होंगे या उन्हें मैन्युअल रूप से कैसे हटाया जाएगा।

मैं खुद को बड़े पैमाने पर श्रमिकों के लिए Redis-to-Go और HireFire के साथ Resque का उपयोग करके Heroku पर हूं।


2
हाय, अर्ध-संबंधित प्रश्न: आपको हर्को के माध्यम से रेसक्यू-वेब डैशबोर्ड कैसे मिला? मैं यह नहीं जान सकता कि इसे कैसे खोला जाए।
एरॉन मार्क्स

जवाबों:


215

इनमें से किसी भी समाधान ने मेरे लिए काम नहीं किया, मैं अब भी इसे रेडिस-वेब में देखूंगा:

0 out of 10 Workers Working

अंत में, यह मेरे लिए सभी श्रमिकों को साफ करने के लिए काम किया:

Resque.workers.each {|w| w.unregister_worker}

12
इसने मेरे लिए काम किया। इसने सभी श्रमिकों को अपंजीकृत किया जो कि थोड़ा परेशान था। लेकिन इसके बाद यह heroku restartचाल चली गई। यह अब श्रमिकों की सही संख्या दर्शाता है।
ब्रायन आर्मस्ट्रांग

इसने वेब इंटरफेस से श्रमिकों को बाहर निकाल दिया, लेकिन वास्तव में वे अभी भी प्रक्रियाओं के रूप में दिखाई देते हैं और कतार से "चुराया" नौकरियों
txwikinger

20
यदि आप केवल उन श्रमिकों को अपंजीकृत करना चाहते हैं जो वास्तविक प्रक्रियाएं नहीं हैं (और शायद प्रसंस्करण कार्य), तो आप यह कोशिश करना चाह सकते हैं Resque.workers.each {|w| matches = w.id.match(/^[^:]*:([0-9]*):[^:]*$/); pid = matches[1]; w.unregister_worker unless w.worker_pids.include?(pid.to_s)}जो केवल उन श्रमिकों को अपंजीकृत कर देगा जो कि pids ज्ञात चल रहे pids का हिस्सा नहीं हैं। मुझे नहीं पता कि यह सभी वातावरण में काम करता है लेकिन यह उबंटू पर अच्छा काम करता है। यह केवल तभी काम कर सकता है जब आपके कार्यकर्ता उसी मशीन पर हों, जिस पर आप यह कोड चलाते हैं।
रोचरी

3
एक विकल्प के रूप में Resque.workers.map &: unregister_worker
AB

यह कैसे आता है कि कर्मचारी को कॉल करने से पहले अपंजीकृत होना चाहिए या नहीं इसके लिए एक चेक शामिल नहीं है unregister_worker? क्या यह निर्धारित करने का कोई तरीका है?
user5243421

53

आपके कंसोल में:

queue_name = "process_numbers"
Resque.redis.del "queue:#{queue_name}"

अन्यथा आप उन्हें हटाने के लिए उन्हें नकली बनाने की कोशिश कर सकते हैं,

Resque::Worker.working.each {|w| w.done_working}

संपादित करें

बहुत से लोग इस उत्तर को बढ़ा रहे हैं और मुझे लगता है कि यह महत्वपूर्ण है कि लोग हॉगोप के समाधान की कोशिश करें, जो श्रमिकों को एक कतार से हटा देता है, जबकि उपरोक्त कोड कतार को हटा देता है। यदि आप उन्हें नकली करने के लिए खुश हैं, तो ठंडा करें।


3
यदि वह ऐसा करता है, तो यह पूरी कतार को हटा देगा, वह बस फंसे हुए लोगों को निकालना चाहता है ..
jBeas

1
छोटा अपडेट: अब आपको Resque.redis.delete के बजाय Resque.redis.del का उपयोग करना होगा
James P McGrath

1
वास्तव में एक Resque.remove_queue () विधि है
iainbeeston

28

आपके पास संभवतः रेक मणि स्थापित है, इसलिए आप कंसोल को खोल सकते हैं और वर्तमान श्रमिकों को प्राप्त कर सकते हैं

Resque.workers

यह श्रमिकों की सूची देता है

#=> [#<Worker infusion.local:40194-0:JAVA_DYNAMIC_QUEUES,index_migrator,converter,extractor>]

कार्यकर्ता चुनें और prune_dead_workers, उदाहरण के लिए पहले वाला

Resque.workers.first.prune_dead_workers

1
दरअसल, दूसरे प्रयास में, यह कुछ भी नहीं किया।
शपीगफोर्ड

2
यह उन अपचारी श्रमिकों को साफ़ करने के लिए महान काम करता है जो बिना अपंजीकृत किए गए मारे गए थे।
लुकास एकलुंड

3
यह नए सबसे अच्छे उत्तर की तरह लगता है क्योंकि यह उन सभी को अपंजीकृत नहीं करता है। क्या prune_dead_workers को क्लास विधि नहीं होना चाहिए? लेकिन किसी भी घटना में, महान समाधान! धन्यवाद।
ब्रायन आर्मस्ट्रांग

यह निश्चित रूप से मारे गए -9 श्रमिकों के लिए समाधान है। केवल एक चीज मैं जोड़ूंगा कि आपको उसी सर्वर पर करने की आवश्यकता है जहां आपने -9 के साथ हत्या की है।
स्टैनिस्लाव ओ। पोगरेबनेक

एक बार में उन सभी के लिए करें: Resque.workers.each (&: prune_dead_workers)
सिंह

25

हेगोप द्वारा उत्तर देने के लिए जोड़ना, मैं केवल अपंजीकृत श्रमिकों में सक्षम होना चाहता था जो एक निश्चित समय के लिए चल रहे थे। नीचे दिया गया कोड केवल 300 सेकंड (5 मिनट) के लिए चल रहे अपंजीकृत कार्यकर्ता होंगे।

Resque.workers.each {|w| w.unregister_worker if w.processing['run_at'] && Time.now - w.processing['run_at'].to_time > 300}

मेरे पास Resque संबंधित रेक कार्यों का एक संग्रह है जो मैंने इसे भी जोड़ा है: https://gist.github.com/ewherrmann/8809350


3
यह दिखाने के लिए कि कैसे नौकरी शुरू करने का समय प्रसंस्करण के माध्यम से ['run_at']। मैं अन्य समाधान है कि .started विधि का उपयोग कर रहे हैं देखा है, लेकिन यह वास्तव में समय देता कार्यकर्ता शुरू किया गया था, न काम है, जो अटक कार्यकर्ताओं को साफ करने के लिए गलत तरीका है। धन्यवाद!
लाचलान कोटर

10

जहाँ भी आप सर्वर को शुरू करने के लिए कमांड चलाते हैं, वहां यह कमांड चलाएँ

$ ps -e -o pid,command | grep [r]esque

आपको कुछ इस तरह से देखना चाहिए:

92102 resque: Processing ProcessNumbers since 1253142769

मेरे उदाहरण में पीआईडी ​​(प्रक्रिया आईडी) पर ध्यान दें यह 92102 है

फिर आप 2 में से 1 प्रक्रिया छोड़ सकते हैं।

  • अनुग्रहपूर्वक उपयोग करें QUIT 92102

  • बलपूर्वक उपयोग करें TERM 92102

* मैं सिंटैक्स के बारे में सुनिश्चित नहीं हूं कि यह QUIT 92102या तो हैQUIT -92102

अगर आपको कोई परेशानी हो तो मुझे बताएं।


3
लिनक्स कंसोल में: मार -SIGQUIT 92102
एलेक्सी

6

मैंने अभी किया:

% rails c production
irb(main):001:0>Resque.workers

कार्यकर्ताओं की सूची मिली।

irb(main):002:0>Resque.remove_worker(Resque.workers[n].id)

... जहां n अवांछित कार्यकर्ता का शून्य आधारित सूचकांक है।


2

मुझे एक समान समस्या थी कि रेडिस ने डीबी को डिस्क में सहेज दिया था जिसमें अमान्य (गैर चल रहे) कार्यकर्ता शामिल थे। हर बार Redis / resque शुरू होने के बाद वे दिखाई दिए।

इसका उपयोग करके ठीक करें:

Resque::Worker.working.each {|w| w.done_working}
Resque.redis.save # Save the DB to disk without ANY workers

सुनिश्चित करें कि आप Redis और अपने Resque कर्मचारियों को पुनरारंभ करें।


2

यहां बताया गया है कि आप मेजबाननाम द्वारा उन्हें Redis से कैसे शुद्ध कर सकते हैं। मेरे साथ ऐसा तब होता है जब मैं एक सर्वर को डिमोशन कर देता हूं और श्रमिक इनायत से बाहर नहीं निकलते हैं।

Resque.workers.each { |w| w.unregister_worker if w.id.start_with?(hostname) }

2

मैं इस मुद्दे पर भाग गया और यहां बहुत सारे सुझावों को लागू करने का मार्ग शुरू किया। हालाँकि, मैंने मूल कारण की खोज की जो इस मुद्दे को बना रहा था कि मैं रत्न रेडिस-आरबी 3.3.0 का उपयोग कर रहा था । Redis-rb 3.2.2 में अपग्रेड करने से इन श्रमिकों को पहले स्थान पर अटकने से रोका गया।


1

हाल ही में https://github.com/shaiguitar/resque_stuck_queue/ पर काम करना शुरू किया । यह अटक श्रमिकों को कैसे ठीक किया जाए इसका कोई हल नहीं है, लेकिन यह resque हैंग होने / अटक जाने के मुद्दे को संबोधित करता है, इसलिए मुझे लगा कि यह इस धागे पर लोगों के लिए मददगार हो सकता है। README से:

"यदि रेसक एक निश्चित समय सीमा के भीतर नौकरियां नहीं चलाता है, तो यह आपकी पसंद के एक पूर्व-परिभाषित हैंडलर को ट्रिगर करेगा। आप इसका उपयोग ईमेल भेजने, पेजर ड्यूटी, अधिक रेसक्यू श्रमिकों को जोड़ने, रेसक्यू को पुनरारंभ करने, आपको एक txt भेजने के लिए कर सकते हैं। ..जो भी आपको सूट करता है। ”

उत्पादन में उपयोग किया जाता है और इस प्रकार अब तक मेरे लिए बहुत अच्छा काम करता है।


0

मैंने यहाँ भी / बासी रेस्क्यू श्रमिकों को अटका दिया था, या मुझे 'नौकरी' कहनी चाहिए, क्योंकि कार्यकर्ता वास्तव में अभी भी है और ठीक चल रहा है, यह कांटे की प्रक्रिया है जो अटकी हुई है।

मैंने कांटेदार प्रक्रिया "प्रसंस्करण" को मारने की क्रूर समाधान को चुना, क्योंकि 5min से अधिक, एक बैश स्क्रिप्ट के माध्यम से, फिर कार्यकर्ता बस कतार में अगले स्पॉन करता है, और सब कुछ चलता रहता है

मेरी स्क्रिप्ट को यहाँ देखें: https://gist.github.com/jobwat/5712437


0

मैंने उन्हें सीधे रेडिस-क्ली से बाहर निकाल दिया है। सौभाग्य से redistogo.com हर्को के बाहर के वातावरण से पहुंच की अनुमति देता है। सूची से मृत कार्यकर्ता आईडी प्राप्त करें। मेरा था

55ba6f3b-9287-4f81-987a-4e8ae7f51210:2

इस कमांड को सीधे रेडिस में चलाएं।

del "resque:worker:55ba6f3b-9287-4f81-987a-4e8ae7f51210:2:*"

आप देख सकते हैं कि यह पर्दे के पीछे क्या कर रहा है।

redis xxx.redistogo.com> MONITOR
OK
1380274567.540613 "MONITOR"
1380274568.345198 "incrby" "resque:stat:processed" "1"
1380274568.346898 "incrby" "resque:stat:processed:c65c8e2b-555a-4a57-aaa6-477b27d6452d:2:*" "1"
1380274568.346920 "del" "resque:worker:c65c8e2b-555a-4a57-aaa6-477b27d6452d:2:*"
1380274568.348803 "smembers" "resque:queues"

दूसरी अंतिम पंक्ति कार्यकर्ता को हटा देती है।


अच्छा विचार नहीं। यह Resque में अपंजीकृत हुक को नहीं बुलाएगा, विफलता को बुलावा नहीं देगा और लोगों को हो सकता है क्लीन अप कोड।
जेरेमी

यह 2 साल पहले resque के साथ उपयोगी था जब यह अटक गई नौकरियों को दिखा रहा था जो कि इंटरफ़ेस का उपयोग करना हटाना असंभव था और रेल में इसे करने का कोई साफ तरीका नहीं था
आंद्रेई आर

0

यदि आप Resque के नए संस्करणों का उपयोग कर रहे हैं, तो आपको निम्नलिखित कमांड का उपयोग करना होगा क्योंकि आंतरिक API बदल गए हैं ...

Resque::WorkerRegistry.working.each {|work| Resque::WorkerRegistry.remove(work.id)}

0

जब तक आपके पास नया संस्करण 1.26.0 है, तब तक यह समस्या से बचता है:

resque: env QUEUE=foo TERM_CHILD=1 bundle exec rake resque:work

ध्यान रखें कि यह वर्तमान में चल रहे काम को खत्म नहीं होने देता है।


0

आप सभी rescueकार्यकर्ता को रोकने के लिए नीचे दिए गए आदेश का भी उपयोग कर सकते हैं

sudo kill -9  `ps aux | grep resque | grep -v grep | cut -c 10-16`

इस लिंक से संदर्भ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.