使用waitpid时处理僵尸进程

时间:2015-10-30 09:48:52

标签: ruby

我有以下方法,想法是运行一个shell命令,并将两个流输出到stdout作为其收到并将信息存储为变量,这样我就可以返回信息的哈希值,我发现没有标准的做法这(你得到流式传输或捕获输出)。

这是通过创建一个for来流输出并附加到我可以在以后读入的IO管道来实现的。

def self.run_cmd(cmd)                                                       
  stdout_rd, stdout_wr = IO.pipe                                            
  stderr_rd, stderr_wr = IO.pipe                                            
  status = Open4::popen4(cmd) do |_pid, _stdin, _stdout, _stderr|           
    pids = []                                                               
    pids << fork do                                                         
      _stdout.each_line do |l|                                              
        print l                                                             
        stdout_wr.puts l                                                    
      end                                                                   
    end                                                                     
    pids << fork do                                                         
      _stderr.each_line do |l|                                              
        print l                                                             
        stderr_wr.puts l                                                    
      end                                                                   
    end                                                                     
    pids.each{|pid| Process.waitpid(pid)}                                   
  end                                                                       
  stdout_wr.close                                                           
  stderr_wr.close                                                           
  out = stdout_rd.gets                                                      
  out = '' if out.nil?                                                      
  err = stderr_rd.gets                                                      
  err = '' if err.nil?                                                      
  { stdout: out, stderr: err, status: status.exitstatus }                   
end

这在大多数情况下效果很好,但具体来说unzip并没有很好地配合这种方式,所发生的事情是在zip的固定数量的输出之后它会停留在stdout_wr.puts l

我观察到当ruby进程停止运行ps

时可以看到僵尸解压缩

有什么方法可以让我的工作吗? 有没有更好的方法呢?我很欣赏它是一个复杂的解决方案,它必须更容易。

我的潜在想法是我的IO管道没有缓冲空间,但我能够毫无问题地打印10,000行输出。

0 个答案:

没有答案
相关问题