it-swarm.cn

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

从附图中可以看出,我有几个工人似乎被卡住了。这些过程不应超过几秒钟。

enter image description here

我不确定为什么他们不会清除或如何手动删除它们。

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

130
Shpigford

这些解决方案都不适用于我,我仍然会在redis-web中看到这个:

0 out of 10 Workers Working

最后,这有助于我清除所有工人:

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

在你的控制台中:

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

否则,您可以尝试将它们伪造成删除它们,并使用:

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

_ edit _

很多人一直在赞同这个答案,我觉得人们尝试hagope的解决方案是非常重要的,这个解决方案会将工作人员从队列中取消注册,而上面的代码会删除队列。如果你很高兴假装它们,那就很酷。

49
Simpleton

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

Resque.workers

它返回一个工人列表

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

选择worker和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/8809350

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将数据库保存到包含无效(非运行)工作程序的磁盘。每次Redis/resque启动时,它们都会出现。

修复此问题:

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

确保重新启动Redis和Resque worker。

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/ 最近。它不是如何解决卡住工人的解决方案,但它解决了resque挂起/被卡住的问题,所以我认为它可能对这个线程上的人有所帮助。来自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"

最后一行删除了工作人员。

0
Andrei R

只要您的resque版本高于1.26.0,就可以避免此问题:

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

我也曾在这里遇到/过时的resque工人,或者我应该说'工作',因为工人实际上仍然在那里并且运行正常,这是分叉的过程被卡住了。

我选择了超过5分钟杀死分叉进程“处理”的残酷解决方案,通过bash脚本,然后工作人员刚刚生成队列中的下一个,一切都在继续

看看我的脚本: https://Gist.github.com/jobwat/5712437

0
jobwat