我有一个使用 resque 来运行一些长时间运行的作业的应用程序。有时需要 8 小时或更长时间才能完成。
在作业失败的情况下,有没有办法监控 resque 本身以查看作业是否正在运行?我知道我可以在数据库表(或 redis 本身)中更新作业的状态,但我想知道作业是否仍在运行,以便在必要时将其终止。
我需要做的具体事情是:
- 确定作业是否仍在运行
- 确定作业是否已停止
- 杀死卡住的工作
我有一个使用 resque 来运行一些长时间运行的作业的应用程序。有时需要 8 小时或更长时间才能完成。
在作业失败的情况下,有没有办法监控 resque 本身以查看作业是否正在运行?我知道我可以在数据库表(或 redis 本身)中更新作业的状态,但我想知道作业是否仍在运行,以便在必要时将其终止。
我需要做的具体事情是:
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
上帝的解决方案最终会杀死可能根本没有卡住或坏的工人。我也开始通过不同的方法来解决这个问题。你做任何你想做的事——当出现任何resque问题时注册一个处理程序(可以杀死、发送电子邮件、发送寻呼机警报等)。
如果在某个时间范围内没有处理作业(因为 resque 被卡住,队列有疯狂的积压,或者 resque 根本没有运行),处理程序将被调用。随意戳阅读自述文件以获取更多详细信息。