Как ждать, пока процесс завершит использование IO.popen? - PullRequest
18 голосов
/ 01 августа 2009

Я использую IO.popen в Ruby для запуска серии команд командной строки в цикле. Затем мне нужно запустить другую команду за пределами цикла. Команда вне цикла не может выполняться, пока все команды в цикле не будут завершены.

Как заставить программу ждать, пока это произойдет? В данный момент последняя команда выполняется слишком рано.

Пример:

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

Так что все cmd_foos необходимо вернуть до запуска another_cmd.

Ответы [ 6 ]

18 голосов
/ 06 августа 2009

Используйте блочную форму и прочитайте весь контент:

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

Если вы не читаете вывод, возможно, процесс блокируется, потому что канал, соединяющий другой процесс и ваш процесс, заполнен, и никто не читает из него.

17 голосов
/ 15 сентября 2012

Видимо канонический способ сделать это:

 Process.wait(popened_io.pid)
6 голосов
/ 02 августа 2009
for foo in bar
  out = IO.popen(cmd_foo)
  out.readlines
end
IO.popen(another_cmd)

Чтение вывода в переменную с последующим вызовом out.readlines. Я думаю, что out.readlines должен дождаться окончания процесса, прежде чем он вернется.

Благодарим Эндрю Y за то, что он указал мне правильное направление.

5 голосов
/ 02 августа 2009

Я думаю, вам нужно присвоить переменным результаты вызовов IO.popen в цикле и продолжать вызывать read() для них, пока eof() не станет истинным для всех.

Тогда вы знаете, что все программы завершили свое выполнение, и вы можете запустить another_cmd.

3 голосов
/ 02 августа 2009

Я предлагаю вам использовать Thread.join для синхронизации последнего popen вызова:

t = Thread.new do
    for foo in bar
       IO.popen(cmd_foo)
    end
end

t.join

IO.popen(another_cmd)
1 голос
/ 03 августа 2009

Вам нужен вывод popen? Если нет, хотите ли вы использовать Kernel#system или какую-либо другую команду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...