У меня есть приложение, которое работает непрерывно, выгружая выходные данные с сервера и отправляя строки на стандартный вывод.Я хочу обработать этот вывод сценарием Ruby.Строки определяются \n
.
Например, я пытаюсь запустить это в командной строке:
myapp.exe | my_script.rb
... с помощью my_script.rb
определен как:
while $stdin.gets
puts $_
end
В конечном итоге я собираюсь обработать строки с помощью регулярных выражений и отобразить некоторые сводные данные, но сейчас я просто пытаюсь подключить основные функции.Когда я запускаю вышеупомянутое, я получаю следующую ошибку:
my_script.rb:1:in `gets': Bad file descriptor (Errno::EBADF)
from my_script.rb:1
Я запускаю это на Windows Server 2003 R2 SP2 и Ruby 1.8.6.
Как непрерывно обрабатывать стандартный ввод вскрипт на Ruby?(Непрерывно, как при не обработке файла, так и до тех пор, пока я его не уничтожу.)
РЕДАКТИРОВАТЬ:
Я смог сделать эту работу, вроде.На моем пути было несколько проблем.С одной стороны, может случиться так, что использование Ruby для обработки переданного по каналу stdin
из другого процесса не работает в Windows 2003R2 .Другое направление, предложенное Адрианом ниже, состояло в том, чтобы запустить мой скрипт как родительский процесс и использовать popen
для подключения к myapp.exe
как fork
ed дочерний процесс.К сожалению, fork
не реализован в Windows, поэтому это тоже не сработало.
Наконец я смог загрузить POpen4 , RubyGem, который реализует popen
в Windows,Используя это в сочетании с предложением Адриана, я смог написать этот скрипт, который делает то, что я действительно хочу - обрабатывает вывод из myapp.exe
:
file: my_script.rb
require 'rubygems'
require 'popen4'
status =
POpen4::popen4("myapp.exe") do |stdout, stderr, stdin, pid|
puts pid
while s = stdout.gets
puts s
end
end
Этот скрипт повторяет вывод myapp.exe
, что именно то, что я хочу.