代码之家  ›  专栏  ›  技术社区  ›  Robin Barnes

如何等待进程使用io.popen完成?

  •  16
  • Robin Barnes  · 技术社区  · 17 年前

    我在用 IO.popen 在Ruby中,在一个循环中运行一系列命令行命令。然后我需要在循环之外运行另一个命令。循环外部的命令在循环中的所有命令终止之前无法运行。

    我如何让程序等待这种情况发生?目前,最后一个命令运行得太快了。

    一个例子:

    for foo in bar
        IO.popen(cmd_foo)
    end
    IO.popen(another_cmd)
    

    所以所有 cmd_foos 需要返回之前 another_cmd 运行。

    6 回复  |  直到 10 年前
        1
  •  4
  •   the Tin Man    10 年前

    我想你需要分配 IO.popen 在循环内调用变量,并继续调用 read() 对他们直到 eof() 一切都变成现实。

    然后你知道所有的程序都已经完成了它们的执行,你可以开始 another_cmd .

        2
  •  18
  •   user13158    17 年前

    使用块形式并阅读所有内容:

    IO.popen "cmd" do |io|
      # 1 array
      io.readlines
    
      # alternative, 1 big String
      io.read
    
      # or, if you have to do something with the output
      io.each do |line|
        puts line
      end
    
      # if you just want to ignore the output, I'd do
      io.each {||}
    end
    

    如果不读取输出,可能是进程阻塞了,因为连接另一个进程和您的进程的管道已满,没有人从中读取。

        3
  •  16
  •   siannopollo    12 年前

    显然是 canonical way 这样做是:

     Process.wait(popened_io.pid)
    
        4
  •  6
  •   the Tin Man    10 年前
    for foo in bar
      out = IO.popen(cmd_foo)
      out.readlines
    end
    IO.popen(another_cmd)
    

    将输出读取到变量,然后调用 out.readlines 做到了。我认为 输出读数 必须等待进程结束后才能返回。

    安德鲁·Y指出了正确的方向,这归功于他。

        5
  •  3
  •   the Tin Man    10 年前

    我建议你用 Thread.join 同步最后一个 popen 呼叫:

    t = Thread.new do
        for foo in bar
           IO.popen(cmd_foo)
        end
    end
    
    t.join
    
    IO.popen(another_cmd)
    
        6
  •  1
  •   the Tin Man    10 年前

    你需要输出 popen ?如果没有,你想用吗 Kernel#system 或者其他命令?

    推荐文章