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

Shp*_*ord 131 ruby-on-rails heroku resque redis ruby-on-rails-3

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

在此输入图像描述

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

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

hag*_*ope 213

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

0 out of 10 Workers Working
Run Code Online (Sandbox Code Playgroud)

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

Resque.workers.each {|w| w.unregister_worker}
Run Code Online (Sandbox Code Playgroud)

  • 如果您只想取消注册非实际进程的工作程序(可能还有处理作业),您可能想要尝试`Resque.workers.each {| w | matches = w.id.match(/ ^ [^:]*:( [0-9]*):[^:]*$ /); pid = matches [1]; w.unregister_worker除非w.worker_pids.include?(pid.to_s)}`,它只会取消注册那些pid不属于已知运行pid的工作者.我不知道这是否适用于所有环境,但它在ubuntu上运行良好.这可能仅在您的工作人员与您运行此代码的同一台计算机上时才有效. (20认同)
  • 这对我有用.它没有注册*所有*工人有点烦人.但是接着`heroku restart`似乎就是这样做的.它现在显示正确的工人数量. (12认同)
  • 作为选项Resque.workers.map&:unregister_worker (3认同)

Sim*_*ton 51

在你的控制台中:

queue_name = "process_numbers"
Resque.redis.del "queue:#{queue_name}"
Run Code Online (Sandbox Code Playgroud)

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

Resque::Worker.working.each {|w| w.done_working}
Run Code Online (Sandbox Code Playgroud)

编辑

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

  • 如果他这样做,它将删除整个队列,他只是想删除卡住的队列.. (3认同)

Sha*_*edo 28

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

Resque.workers
Run Code Online (Sandbox Code Playgroud)

它返回一个工人列表

#=> [#<Worker infusion.local:40194-0:JAVA_DYNAMIC_QUEUES,index_migrator,converter,extractor>]
Run Code Online (Sandbox Code Playgroud)

挑选工人prune_dead_workers,例如第一个工人

Resque.workers.first.prune_dead_workers
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是新的最佳答案,因为它不会注销所有这些答案.prune_dead_workers不应该是一个类方法吗?但无论如何,伟大的解决方案!谢谢. (3认同)
  • 这对于清除那些在没有注销的情况下被杀死的resque工作人员非常有用. (2认同)

ewH*_*ewH 24

除了hagope回答,我希望能够只注销已经运行了一段时间的工作人员.以下代码仅取消注册运行超过300秒(5分钟)的工作人员.

Resque.workers.each {|w| w.unregister_worker if w.processing['run_at'] && Time.now - w.processing['run_at'].to_time > 300}
Run Code Online (Sandbox Code Playgroud)

我正在收集与Resque相关的Rake任务,我还将其添加到:https://gist.github.com/ewherrmann/8809350

  • 通过处理['run_at']显示如何访问作业开始时间的要点.我见过其他使用.started方法的解决方案,但这实际上会返回*worker*启动的时间,而不是作业,这是清除卡住工人的错误方法.谢谢! (3认同)

jBe*_*eas 10

在运行命令的任何位置运行此命令以启动服务器

$ ps -e -o pid,command | grep [r]esque
Run Code Online (Sandbox Code Playgroud)

你应该看到这样的东西:

92102 resque: Processing ProcessNumbers since 1253142769
Run Code Online (Sandbox Code Playgroud)

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

然后你可以退出2种方法中的过程1.

  • 优雅地使用 QUIT 92102

  • 强行使用 TERM 92102

*我不确定它的语法是什么QUIT 92102QUIT -92102

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

  • 在Linux控制台中:kill -SIGQUIT 92102 (3认同)

小智 6

我已经做了:

% rails c production
irb(main):001:0>Resque.workers
Run Code Online (Sandbox Code Playgroud)

得到了工人名单.

irb(main):002:0>Resque.remove_worker(Resque.workers[n].id)
Run Code Online (Sandbox Code Playgroud)

...其中n是不需要的工人的零基指数.