Как определить, когда PTY.spawn закончился в скрипте ruby, чтобы затем начать новый процесс - PullRequest
1 голос
/ 06 декабря 2011

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

Итак, я добавил Process.wait (pid) в скрипт, но теперь скрипт зависает в ожидании ввода на втором PTY.spawn в Process.wait(pid).

Я запускаю скрипт с Ruby 1.9.2, так как я знаю, что были некоторые проблемы с PTY.spawn в Ruby 1.8.7.

Сценарий выглядит следующим образом:

#!/usr/bin/env ruby
require 'pty'
require 'expect'


  PTY.spawn(" apt-get install policycoreutils ") do |reader, writer, pid|
    puts reader.expect(/Do you want to continue/)
    writer.printf("Y\n")
    Process.wait(pid)
  end

  PTY.spawn(" apt-get install libmagick9-dev ") do |reader, writer, pid|
    puts reader.expect(/Do you want to continue/)
    writer.printf("Y\n")
    Process.wait(pid)
  end

Кто-нибудь знает, почему сценарий висит на Process.wait(pid) для второго PTY.spawn?

Ответы [ 2 ]

5 голосов
/ 07 декабря 2011

Чтобы помочь вам в отладке, я немного уменьшил код и породил более мягкую команду:

require 'pty'
require 'expect'

PTY.spawn("sleep 1;echo 1") do |reader, writer, pid|
  puts reader.expect(/1/)
  Process.wait(pid)
end

PTY.spawn("sleep 1;echo 2") do |reader, writer, pid|
  puts reader.expect(/2/)
  Process.wait(pid)
end

Это выводит:

ruby test.rb 
1
2

Это подразумевает, что проблемалежит в командах apt-get.

2 голосов
/ 07 декабря 2011

На самом деле я нашел решение, и оно было очень простым, но немного удивительным.То, что действительно спрашивает второй apt-get, это

 "Do you want to continue [Y/n]? "

Я думаю, что происходило то, что ожидание совпадало с первой частью этой строки и отправляло «Y» до того, как строка полностью завершила выводи apt-get не был готов принять «Y».Как только я изменил ожидаемое совпадение на приведенную выше строку, как в приведенном ниже коде, все заработало нормально.

PTY.spawn(" apt-get install libmagick9-dev ") do |reader, writer, pid|
   puts reader.expect(/Do you want to continue \[Y\/n\]\? /)
   writer.printf("Y\n")
   Process.wait(pid)
 end
...