从附加的图片可以看出,有几个工人似乎卡住了。这些进程不应该需要超过几秒钟。
我不确定它们为什么无法清除或者如何手动删除它们。
我正在使用 Heroku 上的 Resque ,其中包括 Redis-to-Go 和 HireFire 以自动扩展工作程序。
从附加的图片可以看出,有几个工人似乎卡住了。这些进程不应该需要超过几秒钟。
我不确定它们为什么无法清除或者如何手动删除它们。
我正在使用 Heroku 上的 Resque ,其中包括 Redis-to-Go 和 HireFire 以自动扩展工作程序。
这些解决方案都对我没用,我仍然在redis-web中看到这个:
0 out of 10 Workers Working
最后,这个方法对我有效,可以清除所有的工作进程:
Resque.workers.each {|w| w.unregister_worker}
heroku restart
似乎解决了问题。现在它显示了正确数量的工人。 - Brian ArmstrongResque.workers.each {|w| matches = w.id.match(/^[^:]*:([0-9]*):[^:]*$/); pid = matches[1]; w.unregister_worker unless w.worker_pids.include?(pid.to_s)}
。这将仅注销那些pid不属于已知运行pid的工作者。我不知道这在所有环境中是否都有效,但在ubuntu上它表现良好。这可能仅在您的工作者位于运行此代码的同一台机器上时才有效。 - roychriqueue_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的答案基础上,我希望能够只注销已运行一定时间的worker。下面的代码只会注销运行超过300秒(5分钟)的worker。
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
然后有两种方法可以退出进程1 0f 2。
优雅地使用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是不需要的工人的零基索引。
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/。它并不是解决工人卡住的方案,但它可以解决resque挂起/卡住的问题,因此我认为它可能对本主题中的人们有所帮助。从README中得知:
"如果resque在一定时间内没有运行作业,它将触发您选择的预定义处理程序。您可以使用此功能发送电子邮件、警报、添加更多的resque工作程序、重新启动resque、发送短信......任何适合您的方式。"
已经在生产中使用,并且对我来说效果相当不错。