使用resque(ruby)来管理外部长时间运行的命令(和日志任务)是否合理

时间:2016-03-23 19:16:16

标签: ruby linux sinatra resque

我必须经常在我的计算机上运行bash heavy-job.sh <data-num>(需要0.5~2天)来处理位于〜/ a / data / num 的数据。该脚本按顺序调用几个子进程并将日志写入〜/ a / result / num .log。到目前为止,我已手动完成此操作。

我希望将已处理的任务及其状态(成功或失败)等可视化为html表。我写了一个简单的sinatra应用程序来呈现一个显示

的表
  • 要处理的〜/ a / data / num 列表
  • 〜/ a / result / num .log存在与否(处理未启动/处理/完成)
  • 它的状态(日志文件包含单词&#34;错误&#34;或不是)

我发现如果我可以从sinatra应用程序启动bash heavy-job.sh <data-num>,记录任务(以及时间,日期等信息)和它的args(重-jobs需要一些可选的args)并将它们显示为html表。 所以我需要管理作业和日志到文件(或db)的东西。 首先,我编写了一个类似下面的代码用于测试(!用于测试,还没有与我的系统集成!),但后来我发现resque是我想要的。我是初学者,不确定我的决定是否合理。

我的问题是

  • 使用resque管理外部长时间运行的命令(和日志任务)是合理的。
  • 或者我应该使用其他工具(不一定是ruby工具)。
  • (额外;)任务管理器和sinatra应用程序应该单独工作(并通过REST或其他东西相互通信)或不是吗?

作业并不重要,因为如果失败,我可以稍后手动重试任务。 我不擅长英语,我的问题可能会误导。我感谢任何帮助:)。

class TaskSpawn

  def initialize()
    @pids = []
  end

  def spawn(command, options = {})
    #opt = {:pgroup => true}
    @pids << Kernel.spawn(command, options)
  end

  def pids()
    return @pids.clone
  end

  def waitany_nohang()
    delete_idx = nil
    ret = nil
    @pids.each_with_index do |p, idx|
      pid,status = Process.waitpid2(p, Process::WNOHANG)
      unless pid.nil?
        delete_idx = idx
        ret = [pid,status]
        break
      end
    end

    if delete_idx
      @pids.delete_at(delete_idx)
      return ret
    else
      # no task fininshed
      return nil
    end

  end 

  def waitall()
    ret = waitall
    raise "interal error" if ret.size != pids.size
    return ret
  end
end

0 个答案:

没有答案