我有一个使用resque来运行一些长时间运行的作业的应用程序。有时需要8小时或更长时间才能完成。
在作业失败的情况下,有没有办法监控resque本身以查看作业是否正在运行?我知道我可以在数据库表(或redis本身)中更新作业的状态,但我想知道作业是否仍在运行,所以我可以在必要时杀死它。
我需要做的具体事情是:
答案 0 :(得分:3)
Resque github repository拥有这个秘密宝石,god任务就是这样做:观察你的任务并杀死过时的任务。
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
答案 1 :(得分:1)
上帝解决方案最终杀死了可能根本没有陷入困境或者根本没有陷入困境的工人。我也开始通过不同的方法解决这个问题。你做任何你想做的事情 - 当出现任何resque问题时,注册一个处理程序(可以杀死,发送电子邮件,发送寻呼机警报等)。
如果某个作业在某个时间段内没有得到处理(因为resque被卡住,队列有一个疯狂的积压,或者resque根本就没有运行),那么处理程序将被调用。请随意浏览README以获取更多详细信息。