Answers:
这些解决方案都不适合我,我仍然会在redis-web中看到它:
0 out of 10 Workers Working
最后,这对我来说是清除所有工人的工作:
Resque.workers.each {|w| w.unregister_worker}
heroku restart
似乎可以解决问题。现在,它显示正确的工人人数。
Resque.workers.each {|w| matches = w.id.match(/^[^:]*:([0-9]*):[^:]*$/); pid = matches[1]; w.unregister_worker unless w.worker_pids.include?(pid.to_s)}
仅注销那些不属于已知运行pid的工作程序的工作程序。我不知道这是否适用于所有环境,但是在ubuntu上效果很好。仅当您的工作人员与运行此代码的计算机位于同一台计算机上时,这才可能起作用。
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/8809350
在运行命令以启动服务器的任何地方运行此命令
$ ps -e -o pid,command | grep [r]esque
您应该会看到以下内容:
92102 resque: Processing ProcessNumbers since 1253142769
在我的示例中记下PID(进程ID)为92102
然后,您可以退出2种方法之一。
优雅地使用 QUIT 92102
强制使用 TERM 92102
*我不知道语法它要么QUIT 92102
或QUIT -92102
让我知道您是否有任何麻烦。
我遇到了这个问题,并从这里开始实施许多建议。但是,我发现造成此问题的根本原因是我使用的是gem redis-rb 3.3.0。降级到redis-rb 3.2.2可以防止这些工作人员陷入困境。
最近开始在https://github.com/shaiguitar/resque_stuck_queue/上工作。这不是解决卡住的工人的解决方案,但是解决了重新挂起/卡住的问题,因此我认为这可能对从事此工作的人们有所帮助。从自述文件:
“如果resque在特定时间段内没有运行作业,它将触发您选择的预定义处理程序。您可以使用它发送电子邮件,传呼机职责,添加更多resque工作人员,重新启动resque,向您发送txt。 ..最适合你的。”
到目前为止,已用于生产中并且对我来说效果很好。
我也曾在这里困住过时的老工人,或者我应该说“工作”,因为该工人实际上仍在那儿并且运转良好,这是一个分叉的过程。
我选择了一种残酷的解决方案,因为它通过bash脚本在5分钟以上的时间内杀死了分叉的进程“ Processing”,然后该工作人员只是在队列中生成了下一个进程,因此一切继续进行
在这里看看我的脚本: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 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"
最后一行删除工作程序。