ruby timeouts and system commands

前端 未结 4 1873
傲寒
傲寒 2020-12-09 16:13

I have a ruby timeout that calls a system (bash) command like this..

Timeout::timeout(10) {
  `my_bash_command -c12 -o text.txt`
}

but I th

4条回答
  •  醉话见心
    2020-12-09 16:41

    Perhaps this will help someone else looking to achieve similar timeout functionality, but needs to collect the output from the shell command.

    I've adapted @shurikk's method to work with Ruby 2.0 and some code from Fork child process with timeout and capture output to collect the output.

    def exec_with_timeout(cmd, timeout)
      begin
        # stdout, stderr pipes
        rout, wout = IO.pipe
        rerr, werr = IO.pipe
        stdout, stderr = nil
    
        pid = Process.spawn(cmd, pgroup: true, :out => wout, :err => werr)
    
        Timeout.timeout(timeout) do
          Process.waitpid(pid)
    
          # close write ends so we can read from them
          wout.close
          werr.close
    
          stdout = rout.readlines.join
          stderr = rerr.readlines.join
        end
    
      rescue Timeout::Error
        Process.kill(-9, pid)
        Process.detach(pid)
      ensure
        wout.close unless wout.closed?
        werr.close unless werr.closed?
        # dispose the read ends of the pipes
        rout.close
        rerr.close
      end
      stdout
     end
    

提交回复
热议问题