web-dev-qa-db-ja.com

立ち往生/古いResqueワーカーをクリアするにはどうすればよいですか?

添付の画像からわかるように、立ち往生しているように見える労働者が数人います。これらのプロセスは、数秒以上かかることはありません。

enter image description here

なぜクリアされないのか、それらを手動で削除する方法がわからない。

私は、Resque to Redis-to-GoとHireFireを使用してワーカーを自動的にスケーリングするHerokuを使用しています。

131
Shpigford

これらのソリューションはどれも私にとってはうまくいきませんでしたが、私はまだredis-webでこれを見ます:

0 out of 10 Workers Working

最後に、これはすべてのワーカーをクリアするために私のために働いた:

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

コンソールで:

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

そうでなければ、それらを削除するために行われたとしてそれらを偽造しようとすることができます:

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

編集

多くの人々がこの答えを支持してきました。上記のコードはキューを削除しますが、人々はキューからワーカーを登録解除するhagopeのソリューションを試すことが重要だと思います。あなたがそれらを偽造することに満足しているなら、クールです。

49
Simpleton

おそらくresque gemがインストールされているので、コンソールを開いて現在のワーカーを取得できます

Resque.workers

ワーカーのリストを返します

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

ワーカーとPrune_dead_workersを選択します。たとえば、最初のもの

Resque.workers.first.Prune_dead_workers
28
Shairon Toledo

Hagopeによる回答に加えて、一定の時間実行されていたワーカーのみを登録解除できるようにしたいと考えました。以下のコードは、300秒(5分)以上実行しているワーカーのみを登録解除します。

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

私はResqueに関連するRakeタスクのコレクションを次々に追加しており、これらも追加しています https://Gist.github.com/ewherrmann/880935

24
ewH

サーバーを起動するコマンドを実行した場所でこのコマンドを実行します

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

次のように表示されます。

92102 resque: Processing ProcessNumbers since 1253142769

私の例ではPID(プロセスID)をメモします92102

その後、2つの方法のうち1つを終了できます。

  • QUIT 92102を適切に使用する

  • TERM 92102を強制的に使用する

*QUIT 92102またはQUIT -92102のいずれかの構文であるかどうかわかりません

問題があれば教えてください。

9
jBeas

今やりました:

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

労働者のリストを得た。

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

...ここで、nは不要なワーカーのゼロベースのインデックスです。

6
user2811637

私はこの問題にぶつかり、多くの提案をここで実装する道を歩み始めました。しかし、この問題を引き起こしていた根本的な原因は、私が gem redis-rb 3.3.0を使用 であったことでした。 redis-rb 3.2.2へのダウングレードにより、これらのワーカーがそもそも動けなくなるのを防ぎました。

2
Will Bryant

Redisが、無効な(実行されていない)ワーカーを含むディスクにDBを保存するという同様の問題がありました。 Redis/resqueが開始されるたびに、それらが現れました。

これを修正するには:

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

RedisとResqueワーカーを必ず再起動してください。

2
joost

ホスト名でRedisからそれらを削除する方法は次のとおりです。これは、サーバーを使用停止し、ワーカーが正常に終了しないときに発生します。

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

最近作業を開始しました https://github.com/shaiguitar/resque_stuck_queue/ スタックしたワーカーを修正する方法の解決策ではありませんが、ハングしたりスタックしたりするという問題に対処するため、このスレッドの人々に役立つと考えました。 READMEから:

「resqueが特定の時間枠内でジョブを実行しない場合、選択した定義済みハンドラーがトリガーされます。これを使用して、電子メール、ポケットベル義務、resqueワーカーの追加、resqueの再起動、txtの送信を行うことができます。 ..あなたに合ったものは何でも。」

本番環境で使用されており、これまでのところ私にとって非常にうまく機能しています。

1
Shai

Redis-cliから直接削除しました。幸いなことにredistogo.comはherokuの外部環境からのアクセスを許可します。リストから無効なワーカーIDを取得します。私のものは

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
Andrei R

これにより、1.26.0より新しいresqueバージョンがあれば問題を回避できます。

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

現在実行中のジョブを終了させないことに注意してください。

0
Joakim Kolsjö

Resqueの新しいバージョンを使用している場合、内部APIが変更されたため、次のコマンドを使用する必要があります...

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

以下のコマンドを使用して、すべてのrescueワーカーを停止することもできます

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

このリンクからの参照

0
uzaif

私もここで立ち往生している/古いレスキューワーカーがいました、または「ジョブ」と言う必要があります。ワーカーは実際にはまだそこにいて正常に動作しているからです。

5分以上、bashスクリプトを介してフォークプロセス「Processing」を強制終了するという残忍なソリューションを選択しました。その後、ワーカーは次のキューを生成し、すべてが続行します。

ここで私のスクリプトを見てください: https://Gist.github.com/jobwat/5712437

0
jobwat