আমি কীভাবে আটকে / বাসি রেসকিউ কর্মীদের পরিষ্কার করব?


132

সংযুক্ত চিত্র থেকে আপনি দেখতে পাচ্ছেন, আমার কাছে কয়েকজন কর্মী রয়েছেন যা মনে হয় আটকে আছে। এই প্রক্রিয়াগুলি কয়েক সেকেন্ডের বেশি সময় নেয় না।

এখানে চিত্র বর্ণনা লিখুন

আমি নিশ্চিত নই কেন তারা পরিষ্কার করবেন না বা কীভাবে ম্যানুয়ালি এগুলি সরিয়ে ফেলবেন।

আমি হিরোকুতে রেডিস-টু-গো এবং হায়ারফায়ারের সাহায্যে কর্মীদের স্বয়ংক্রিয়ভাবে স্কেল করতে ব্যবহার করছি que


2
হাই, আধা-সম্পর্কিত প্রশ্ন: আপনি কীভাবে হিরকুর মাধ্যমে রেকি-ওয়েব ড্যাশবোর্ড পেয়েছেন? কীভাবে এটি খুলব তা আমি বুঝতে পারি না।
অ্যারন

উত্তর:


215

এই সমাধানগুলির কোনওটিই আমার পক্ষে কাজ করে নি, আমি এখনও এটি পুনরায় ওয়েবে দেখতে পাবো:

0 out of 10 Workers Working

অবশেষে, এটি আমার পক্ষে সমস্ত শ্রমিককে সাফ করার জন্য কাজ করেছিল:

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

12
এটি আমার পক্ষে কাজ করেছে। এটি সমস্ত কর্মী নিবন্ধিত হয়েছে যা কিছুটা বিরক্তিকর ছিল। কিন্তু এরপরে heroku restartএটি কৌশলটি দেখে মনে হয়েছিল। এটি এখন কর্মীদের সঠিক সংখ্যা দেখায়।
ব্রায়ান আর্মস্ট্রং

এটি ওয়েব ইন্টারফেস থেকে কর্মীদের বের করে
এনেছিল

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)}যা কেবলমাত্র সেই শ্রমিকদের নিবন্ধন করবে যা পিডগুলি চলমান পিডগুলির অংশ নয় not এটি সমস্ত পরিবেশে কাজ করে কিনা জানি না তবে এটি উবুন্টুতে ভাল কাজ করে। এটি কেবল তখনই কাজ করতে পারে যখন আপনি এই কোডটি চালান সেই সময় আপনার শ্রমিকরা একই মেশিনে থাকে।
রোছ্রি

3
বিকল্প হিসাবে Resque.workers.map &: নিবন্ধভুক্ত_কর্মী
এবি

কীভাবে এটি কল করার আগে শ্রমিককে নিবন্ধভুক্ত করা উচিত কিনা তা পরীক্ষা করে কীভাবে অন্তর্ভুক্ত করা যায় না unregister_worker? এটি নির্ধারণ করার কোনও উপায় আছে?
ব্যবহারকারী5243421

53

আপনার কনসোলটিতে:

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

অন্যথায় আপনি এগুলি মুছে ফেলার জন্য এটি করা হয়েছে বলে নকল করার চেষ্টা করতে পারেন:

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

সম্পাদনা

প্রচুর লোকেরা এই উত্তরটিকে সমর্থন করে আসছে এবং আমি অনুভব করি যে লোকেরা হাগোপের সমাধান চেষ্টা করা গুরুত্বপূর্ণ যা কর্মীদের একটি সারি থেকে রেজিস্ট্রেশন না করে, যেখানে উপরের কোডটি সারিগুলি মুছে ফেলে। আপনি যদি তাদের জাল করে খুশি হন তবে শীতল হোন।


3
তিনি যদি এটি করেন তবে এটি পুরো সারি মুছে ফেলবে, তিনি কেবল আটকে
থাকাগুলি

1
ছোট আপডেট: আপনাকে এখন Resque.redis.delete এর পরিবর্তে Resque.redis.del ব্যবহার করতে হবে
জেমস পি ম্যাকগ্রা

1
বাস্তবে এখন একটি রেস.রেমভ_উইউ () পদ্ধতি রয়েছে
ইইনবেস্টন

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
আসলে, দ্বিতীয় চেষ্টা করেও, এটি কিছুই করেনি।
Shpigford

2
এটি নিবন্ধভুক্ত না করে মারা যাওয়া রিক্সা কর্মীদের সাফ করার জন্য দুর্দান্ত কাজ করে।
লুকাস একলুন্ড

3
এটি নতুন সেরা উত্তরের মতো বলে মনে হচ্ছে যেহেতু এটি সকলেরই নিবন্ধন করে না। ছাঁটাই_দেব_কর্মীদের একটি শ্রেণি পদ্ধতি হওয়া উচিত নয়? তবে যে কোনও ইভেন্টে দুর্দান্ত সমাধান! ধন্যবাদ।
ব্রায়ান আর্মস্ট্রং

নিহত -৯ শ্রমিকদের অবশ্যই সমাধান এটি। কেবলমাত্র আমি যুক্ত করব তা হ'ল আপনাকে একই সার্ভারে এটি করতে হবে যেখানে আপনি -9 দিয়ে হত্যা করেছিলেন।
স্ট্যানিস্লাভ ও পোগ্রেবন্যাক

তাদের সবার সাথে একসাথে এটি করুন: Resque.workers.each (&: prune_dead_workers)
লিও

24

হ্যাগোপে জবাব দেওয়ার জন্য, আমি কেবলমাত্র নিবন্ধিত কর্মীদের জন্য সক্ষম হতে চাই যারা একটি নির্দিষ্ট সময়ের জন্য চলছিল। নীচের কোডটি কেবলমাত্র 300 সেকেন্ডের (5 মিনিট) বেশি সময় ধরে চালিত নিবন্ধভুক্ত কর্মীদের জন্য নিবন্ধভুক্ত হবে।

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

আমার কাছে রেসেক সম্পর্কিত রেক কার্যগুলির একটি চলমান সংগ্রহ রয়েছে যা আমি এটিতে যুক্ত করেছি: https://gist.github.com/ewherrmann/8809350


3
['Run_at'] প্রসেসিংয়ের মাধ্যমে কীভাবে কাজের শুরু সময় অ্যাক্সেস করবেন তা দেখানোর পয়েন্ট আমি অন্যান্য সমাধানগুলি দেখেছি যা। স্টার্ট পদ্ধতি ব্যবহার করছে, তবে এটি প্রকৃতপক্ষে কর্মীর শুরু হওয়ার সময়টি ফিরিয়ে দেয় , কাজ নয়, আটকে থাকা শ্রমিকদের সাফ করার জন্য এটি ভুল পদ্ধতি। ধন্যবাদ!
লাচলান কোটার

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)

... যেখানে অবাঞ্ছিত কর্মীর শূন্য ভিত্তিক সূচক।


2

আমার অনুরূপ সমস্যা ছিল যে রেডিস ডিবিতে ডিস্কে সংরক্ষণ করেছিলেন যাতে অবৈধ (অচল) কর্মীরা অন্তর্ভুক্ত রয়েছে। প্রতিবার রেডিস / রেসকিউ শুরু হয়ে গেলে তারা উপস্থিত হয়েছিল।

এটি ব্যবহার করে এটি ঠিক করুন:

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

আপনি রেডিস এবং আপনার রেসকিউ কর্মীদের পুনরায় চালু করার বিষয়টি নিশ্চিত করুন।


2

হোস্টনেম করে আপনি রেডিস থেকে কীভাবে তাদের শুচি করতে পারেন তা এখানে। আমি যখন কোনও সার্ভারকে ডিকমিনেশন করি এবং শ্রমিকরা কৌতুকপূর্ণভাবে প্রস্থান না করে তখন আমার সাথে এটি ঘটে।

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

2

আমি এই ইস্যুতে ছুটে এসেছি এবং এখানে প্রচুর পরামর্শ বাস্তবায়নের পথে শুরু করেছি। তবে, আমি আবিষ্কার করেছি যে মূল কারণটি এই সমস্যাটি তৈরি করছে তা হ'ল আমি রত্ন redis-rb 3.3.0 ব্যবহার করছি । Redis-rb 3.2.2 এ ডাউনগ্রেডিং এই শ্রমিকদের প্রথম স্থানে আটকাতে বাধা দেয়।


1

সম্প্রতি https://github.com/shaiguitar/resque_stuck_queue/ এ কাজ শুরু করেছেন। আটকে পড়া শ্রমিকদের কীভাবে সংশোধন করা যায় তার সমাধান নয় তবে এটি রিকুই ঝুলানো / আটকে থাকার বিষয়টি বিবেচনা করে, তাই আমি অনুভব করেছি যে এটি এই থ্রেডের জন্য মানুষের পক্ষে সহায়ক হতে পারে। README থেকে:

"যদি রেসিউক নির্দিষ্ট সময়সীমার মধ্যে চাকরী না চালায় তবে এটি আপনার পছন্দের প্রাক-সংজ্ঞায়িত হ্যান্ডলারকে ট্রিগার করবে You আপনি এটি ইমেল, পেজার শুল্ক প্রেরণ, আরও রিসিকি কর্মী যুক্ত করতে, পুনরায় আরম্ভ করতে, আপনাকে একটি পাঠ্য পাঠানোর জন্য ব্যবহার করতে পারেন। .. যাই হোক না কেন আপনার পছন্দ। "

উত্পাদনে ব্যবহৃত হয়েছে এবং এখন পর্যন্ত আমার পক্ষে বেশ ভালভাবে কাজ করে।


0

আমি এখানেও বাসি রেসিও শ্রমিকদের আটকে রেখেছি বা বলেছিলাম 'চাকরি', কারণ শ্রমিকটি এখনও সেখানে রয়েছেন এবং জরিমানা চলছে, এটি আটকে থাকা কাঁটা প্রক্রিয়া।

আমি পাঁচ মিনিটেরও বেশি সময় থেকে কাঁটাচামচ প্রক্রিয়া "প্রসেসিং" হত্যার নৃশংস সমাধানটি বাশ স্ক্রিপ্টের মাধ্যমে বেছে নিয়েছি, তারপরে কর্মী স্রেফ পরবর্তী কাতারে ছড়িয়ে দিয়েছিল এবং সব কিছু চালিয়ে যেতে থাকে

আমার স্ক্রিপ্টটি এখানে দেখুন: https://gist.github.com/jobwat/5712437


0

আমি এগুলি সরাসরি redis-cli থেকে সাফ করে দিয়েছি। ভাগ্যক্রমে redistogo.com হির্কুর বাইরের পরিবেশ থেকে অ্যাক্সেসের অনুমতি দেয়। তালিকা থেকে মৃত কর্মীর আইডি পান। আমার ছিল

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

এই কমান্ডটি সরাসরি redis এ চালান।

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

পর্দার আড়ালে এটি কী করছে তা দেখতে আপনি redis db পর্যবেক্ষণ করতে পারেন।

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"

দ্বিতীয় শেষ লাইনটি শ্রমিককে মুছে দেয়।


ভালো বুদ্ধি নই. এটি রেসিতে নিবন্ধভুক্ত হুকগুলি কল করবে না, কলিং ব্যর্থতা এবং লোকেদের সম্ভাব্য ক্লিন আপ কোডকে কল করবে না।
জেরেমি

2 বছর আগে যখন এটি আটকে পড়া কাজগুলি দেখানো ছিল যা ইন্টারফেস ব্যবহার করে মুছে ফেলা অসম্ভব ছিল এবং রেলপথে এটি করার কোনও পরিষ্কার উপায় ছিল না
আন্ড্রে আর

0

আপনি যদি রেসকের নতুন সংস্করণগুলি ব্যবহার করছেন তবে অভ্যন্তরীণ এপিআইগুলি পরিবর্তিত হওয়ায় আপনাকে নিম্নলিখিত কমান্ডটি ব্যবহার করতে হবে ...

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

মনে রাখবেন যে এটি বর্তমানে চলমান কাজ শেষ করতে দেয় না।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.