添付の画像からわかるように、立ち往生しているように見える労働者が数人います。これらのプロセスは、数秒以上かかることはありません。
なぜクリアされないのか、それらを手動で削除する方法がわからない。
私は、Resque to Redis-to-GoとHireFireを使用してワーカーを自動的にスケーリングするHerokuを使用しています。
これらのソリューションはどれも私にとってはうまくいきませんでしたが、私はまだredis-webでこれを見ます:
0 out of 10 Workers Working
最後に、これはすべてのワーカーをクリアするために私のために働いた:
Resque.workers.each {|w| w.unregister_worker}
コンソールで:
queue_name = "process_numbers"
Resque.redis.del "queue:#{queue_name}"
そうでなければ、それらを削除するために行われたとしてそれらを偽造しようとすることができます:
Resque::Worker.working.each {|w| w.done_working}
編集
多くの人々がこの答えを支持してきました。上記のコードはキューを削除しますが、人々はキューからワーカーを登録解除するhagopeのソリューションを試すことが重要だと思います。あなたがそれらを偽造することに満足しているなら、クールです。
おそらく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
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
サーバーを起動するコマンドを実行した場所でこのコマンドを実行します
$ 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
のいずれかの構文であるかどうかわかりません
問題があれば教えてください。
今やりました:
% Rails c production
irb(main):001:0>Resque.workers
労働者のリストを得た。
irb(main):002:0>Resque.remove_worker(Resque.workers[n].id)
...ここで、nは不要なワーカーのゼロベースのインデックスです。
私はこの問題にぶつかり、多くの提案をここで実装する道を歩み始めました。しかし、この問題を引き起こしていた根本的な原因は、私が gem redis-rb 3.3.0を使用 であったことでした。 redis-rb 3.2.2へのダウングレードにより、これらのワーカーがそもそも動けなくなるのを防ぎました。
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ワーカーを必ず再起動してください。
ホスト名でRedisからそれらを削除する方法は次のとおりです。これは、サーバーを使用停止し、ワーカーが正常に終了しないときに発生します。
Resque.workers.each { |w| w.unregister_worker if w.id.start_with?(hostname) }
最近作業を開始しました https://github.com/shaiguitar/resque_stuck_queue/ スタックしたワーカーを修正する方法の解決策ではありませんが、ハングしたりスタックしたりするという問題に対処するため、このスレッドの人々に役立つと考えました。 READMEから:
「resqueが特定の時間枠内でジョブを実行しない場合、選択した定義済みハンドラーがトリガーされます。これを使用して、電子メール、ポケットベル義務、resqueワーカーの追加、resqueの再起動、txtの送信を行うことができます。 ..あなたに合ったものは何でも。」
本番環境で使用されており、これまでのところ私にとって非常にうまく機能しています。
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行目でワーカーが削除されます。
これにより、1.26.0より新しいresqueバージョンがあれば問題を回避できます。
resque: env QUEUE=foo TERM_CHILD=1 bundle exec rake resque:work
現在実行中のジョブを終了させないことに注意してください。
Resqueの新しいバージョンを使用している場合、内部APIが変更されたため、次のコマンドを使用する必要があります...
Resque::WorkerRegistry.working.each {|work| Resque::WorkerRegistry.remove(work.id)}
以下のコマンドを使用して、すべてのrescue
ワーカーを停止することもできます
Sudo kill -9 `ps aux | grep resque | grep -v grep | cut -c 10-16`
私もここで立ち往生している/古いレスキューワーカーがいました、または「ジョブ」と言う必要があります。ワーカーは実際にはまだそこにいて正常に動作しているからです。
5分以上、bashスクリプトを介してフォークプロセス「Processing」を強制終了するという残忍なソリューションを選択しました。その後、ワーカーは次のキューを生成し、すべてが続行します。
ここで私のスクリプトを見てください: https://Gist.github.com/jobwat/5712437