如何清除卡住/陈旧的Resque工人?

从附图中可以看出,我有几个似乎被卡住的工人。 这些过程不应该花费比几秒钟更长的时间。

在这里输入图像说明

我不知道为什么他们不会清除或者如何手动删除它们。

我在Heroku上使用Resis和Redis-to-Go和HireFire来自动扩展工作。

这些解决scheme都没有为我工作,我仍然可以在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的解决scheme,将工作人员从队列中解脱出来,而上面的代码删除了队列。 如果你很高兴假冒他们,那么很酷。

您可能已经安装了resque gem,因此您可以打开控制台并获取当前的工作人员

 Resque.workers 

它返回一个工作人员名单

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

select工人和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/8809350

无论您运行命令来启动服务器,都可以运行此命令

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

你应该看到这样的东西:

 92102 resque: Processing ProcessNumbers since 1253142769 

记下我的例子中的PID(进程id)是92102

然后你可以退出这个过程的两种方法之一。

  • 优雅地使用QUIT 92102

  • 有用的TERM 92102

*我不确定QUIT 92102QUIT -92102的语法

如果您有任何问题,请告诉我。

我已经做了:

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

得到了工人的名单。

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

…其中n是不需要的工人的基于零的索引。

我有一个类似的问题,Redis将数据库保存到包含无效(非运行)工作的磁盘上。 每次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) } 

我遇到了这个问题,并开始执行这里的很多build议。 但是,我发现造成这个问题的根本原因是我使用了gem redis-rb 3.3.0 。 降级到redis-rb 3.2.2可以防止这些工人陷入困境。

最近开始在https://github.com/shaiguitar/resque_stuck_queue/上工作。; 这不是一个如何解决卡住的工人的解决scheme,但它解决了挂起/被卡住的问题,所以我认为这可能对这个线程的人有帮助。 从自述文件:

“如果resque在某个时间段内没有运行作业,它会触发一个预定义的处理程序,你可以使用它来发送电子邮件,寻呼机的工作,添加更多resque工作者,重新启动resque,发送一个txt。 ..什么都适合你。“

到目前为止,已经在生产中使用,对我来说工作得很好。

我在这里也遇到了/ stale resque工作者,或者我应该说'工作',因为工作者实际上仍然在那里,运行良好,这是被卡住的分叉过程。

我select了一个残酷的解决scheme,从5分钟以上,通过一个bash脚本,杀死分叉进程“处理”,然后工人刚刚产生下一个队列,一切都不断

看看我的脚本在这里: https : //gist.github.com/jobwat/5712437

我已经从redis-cli直接清除了它们。 幸运的是,redistogo.com允许从heroku以外的环境访问。 从列表中获取无效的工作者ID。 我的

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

在redis中直接运行这个命令。

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

你可以监视redis数据库,看看它在幕后做了什么。

 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,则需要使用以下命令,因为内部API已更改…

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

这可以避免这个问题,只要你有一个比1.26.0更新的版本:

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

请记住,它不会让当前正在运行的作业完成。