Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 找出resque作业是否仍在运行,如果它';它卡住了_Ruby On Rails_Ruby_Caching_Redis_Resque - Fatal编程技术网

Ruby on rails 找出resque作业是否仍在运行,如果它';它卡住了

Ruby on rails 找出resque作业是否仍在运行,如果它';它卡住了,ruby-on-rails,ruby,caching,redis,resque,Ruby On Rails,Ruby,Caching,Redis,Resque,我有一个应用程序,它使用resque运行一些长期运行的作业。有时需要8小时或更长时间才能完成 在作业失败的情况下,是否有方法监视resque本身以查看作业是否正在运行?我知道我可以在数据库表(或redis本身)中更新作业的状态,但我想知道作业是否仍在运行,以便在必要时杀死它 我需要做的具体事情是: 确定作业是否仍在运行 确定作业是否已停止 杀死卡住的工作 Resque有一个秘密宝石,一个能做到这一点的任务:观察你的任务并杀死过时的任务 Resque有一个秘密的宝石,一个可以做到这一点的任务:

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

在作业失败的情况下,是否有方法监视resque本身以查看作业是否正在运行?我知道我可以在数据库表(或redis本身)中更新作业的状态,但我想知道作业是否仍在运行,以便在必要时杀死它

我需要做的具体事情是:

  • 确定作业是否仍在运行
  • 确定作业是否已停止
  • 杀死卡住的工作
Resque有一个秘密宝石,一个能做到这一点的任务:观察你的任务并杀死过时的任务

Resque有一个秘密的宝石,一个可以做到这一点的任务:观察你的任务并杀死过时的任务


上帝的解决方案最终杀死了那些可能根本没有陷入困境或不好的工人。我也开始用不同的方法来解决这个问题。你可以做任何你想做的事情——当出现任何问题时,注册一个处理程序(可以杀死、发送电子邮件、发送寻呼机警报等)

如果某个作业在某个时间段内没有得到处理(可能是因为resque被卡住,队列有一个疯狂的积压,或者resque根本没有运行),处理程序将被调用。请随意查看自述文件以了解更多细节


上帝的解决方案最终杀死了那些可能根本没有陷入困境或不好的工人。我也开始用不同的方法来解决这个问题。你可以做任何你想做的事情——当出现任何问题时,注册一个处理程序(可以杀死、发送电子邮件、发送寻呼机警报等)

如果某个作业在某个时间段内没有得到处理(可能是因为resque被卡住,队列有一个疯狂的积压,或者resque根本没有运行),处理程序将被调用。请随意查看自述文件以了解更多细节


谢谢你的帮助。很明显,这将杀死已经运行过特定时间段的作业(尽管无法确定作业是否被卡住或仍在处理)。我正在运行的作业可能需要几分钟到24小时或更长的时间,具体取决于基础数据。@KevinBedell:您可以将超时设置为36-48小时:)是的-没错。我想我需要把它和一种直接监控工作进度的方法结合起来,这样我才能看到它是否还在工作。@KevinBedell:是的,应该不会太难。把它放在这里就行了。我认为Bee有一个很好的问题,我认为这个问题在很多很多情况下都是相关的。当彼此共享代码时,我们应该共享代码应该包含在项目中的位置的上下文。谢谢。很明显,这将杀死已经运行过特定时间段的作业(尽管无法确定作业是否被卡住或仍在处理)。我正在运行的作业可能需要几分钟到24小时或更长的时间,具体取决于基础数据。@KevinBedell:您可以将超时设置为36-48小时:)是的-没错。我想我需要把它和一种直接监控工作进度的方法结合起来,这样我才能看到它是否还在工作。@KevinBedell:是的,应该不会太难。把它放在这里就行了。我认为Bee有一个很好的问题,我认为这个问题在很多很多情况下都是相关的。当彼此共享代码时,我们应该共享代码应该包含在项目中的位置的上下文。
# 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