Я пишу код, который берет файл, передает этот файл в один из нескольких исполняемых файлов для обработки и отслеживает процесс преобразования ошибок. Я написал и протестировал следующую процедуру на OSX, но linux не удалось по причинам, о которых я не понимаю.Ruby on Linux PTY уходит без EOF, поднимает Errno :: EIO
#run the command, capture the output so it doesn't display
PTY.spawn(command) {|r,w,pid|
until r.eof? do
##mark
puts r.readline
end
}
Команда, которая работает меняется довольно много, и код на отметке ## упрощен в локальное эхо в попытке отладить проблему. Команда выполняется, и сценарий печатает ожидаемый вывод в терминале и затем выдает исключение.
Ошибка производит на системах Debian является: Errno::EIO (Input/output error - /dev/pts/0):
Всего командных строк я могу придумать производить эту ошибку, и когда я запускаю код без локального блока эха он работает просто отлично:
PTY.spawn(command) {|r,w,pid|}
В любом случае сама команда выполняется нормально, но, похоже, debian linux не отправляет eof по pty. Страницы документов для PTY и IO на ruby-doc, похоже, здесь не помогают.
Любые предложения? Благодарю.
-vox-
Это всего лишь догадка, но правильно ли вычитаются строки в Ruby версии Debian? Если это проблема, и вы используете rvm, их заметки по этому вопросу могут быть полезны: [http://beginrescueend.com/packages/readline/] (http://beginrescueend.com/packages/readline/) – forforf
Thats хорошая мысль. Я не использую rvm на этих серверах, но я скомпилировал ruby1.9.3 из исходного кода (и на другой сервер 1.9.2). Я не считал, что изменение библиотеки readline может сортировать ее. Спасибо за предложение. – voxobscuro
libreadline связан с редактированием командной строки, историей и т. Д. (Например, в irb). Это не влияет на метод чтения IO # readline. Вы можете скомпилировать Ruby без поддержки libreadline, и IO будет работать как ожидалось (но irb будет неприятно использовать). –