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 に答える