Как прокси процесс оболочки в ruby - PullRequest
2 голосов
/ 29 января 2011

Я создаю скрипт для переноса jdb (отладчик Java). По сути, я хочу обернуть этот процесс и прокси взаимодействия с пользователем. Итак, я хочу это:

  • запустить JDB из моего скрипта
  • отправить вывод jdb на стандартный вывод
  • пауза и ожидание ввода, когда jdb делает
  • когда пользователь вводит команды, передайте его jdb

В данный момент я действительно хочу пройти через JDB. Причина этого состоит в том, чтобы инициализировать процесс с определенными параметрами и потенциально добавлять больше команд в будущем.

Обновление: Вот оболочка того, что сработало для меня, используя функцию ожидаемого:

PTY.spawn("jdb -attach 1234") do |read,write,pid|
  write.sync = true

  while (true) do
    read.expect(/\r\r\n> /) do |s|
      s = s[0].split(/\r\r\n/)
      s.pop # get rid of prompt                                                                                              

      s.each { |line| puts line }

      print '> '
      STDOUT.flush

      write.print(STDIN.gets)
    end
  end
end

Ответы [ 2 ]

4 голосов
/ 29 января 2011

Используйте Open3.popen3().Например:

 Open3.popen3("jdb args") { |stdin, stdout, stderr|
     # stdin = jdb's input stream
     # stdout = jdb's output stream
     # stderr = jdb's stderr stream
     threads = []
     threads << Thread.new(stderr) do |terr|
         while (line = terr.gets)
            puts "stderr: #{line}"
         end
     end
     threads << Thread.new(stdout) do |terr|
         while (line = terr.gets)
            puts "stdout: #{line}"
         end
     end
     stdin.puts "blah"
     threads.each{|t| t.join()} #in order to cleanup when you're done.
 }

Я привел вам примеры для потоков, но вы, конечно, хотите быть отзывчивыми на то, что делает jdb.Вышесказанное является просто скелетом для того, как вы открываете процесс и управляете связью с ним.

0 голосов
/ 30 января 2011

Стандартная библиотека Ruby включает в себя expect, которая предназначена именно для такого типа проблем.См. документацию для получения дополнительной информации.

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