2

我有一个使用 resque 来运行一些长时间运行的作业的应用程序。有时需要 8 小时或更长时间才能完成。

在作业失败的情况下,有没有办法监控 resque 本身以查看作业是否正在运行?我知道我可以在数据库表(或 redis 本身)中更新作业的状态,但我想知道作业是否仍在运行,以便在必要时将其终止。

我需要做的具体事情是:

  • 确定作业是否仍在运行
  • 确定作业是否已停止
  • 杀死卡住的工作
4

2 回答 2

3

Resque github 存储库有这个秘密的宝石,一个上帝的任务可以做到这一点:观察你的任务并杀死过时的任务。

https://github.com/resque/resque/blob/master/examples/god/stale.god

# This will ride alongside god and kill any rogue stale worker
# processes. Their sacrifice is for the greater good.

WORKER_TIMEOUT = 60 * 10 # 10 minutes

Thread.new do
  loop do
    begin
      `ps -e -o pid,command | grep [r]esque`.split("\n").each do |line|
        parts   = line.split(' ')
        next if parts[-2] != "at"
        started = parts[-1].to_i
        elapsed = Time.now - Time.at(started)

        if elapsed >= WORKER_TIMEOUT
          ::Process.kill('USR1', parts[0].to_i)
        end
      end
    rescue
      # don't die because of stupid exceptions
      nil
    end

    sleep 30
  end
end
于 2012-05-25T16:22:10.560 回答
1

上帝的解决方案最终会杀死可能根本没有卡住或坏的工人。我也开始通过不同的方法来解决这个问题。你做任何你想做的事——当出现任何resque问题时注册一个处理程序(可以杀死、发送电子邮件、发送寻呼机警报等)。

如果在某个时间范围内没有处理作业(因为 resque 被卡住,队列有疯狂的积压,或者 resque 根本没有运行),处理程序将被调用。随意戳阅读自述文件以获取更多详细信息。

https://github.com/shaiguitar/resque_stuck_queue#readme

于 2014-01-06T05:34:25.773 回答