Estoy escribiendo un código que toma un archivo, pasa ese archivo a uno de varios binarios para su procesamiento y supervisa el proceso de conversión para detectar errores. He escrito y probado la siguiente rutina en OSX, pero Linux falla por razones sobre las cuales no estoy seguro.Ruby en Linux PTY desaparece sin EOF, aumenta 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
}
El comando que se ejecuta varía mucho y el código en la marca de ## se ha simplificado en un eco local en un intento de depurar el problema. El comando se ejecuta y el script imprime el resultado esperado en el terminal y luego lanza una excepción.
El error se produce en sistemas Debian es: Errno::EIO (Input/output error - /dev/pts/0):
Todas las cadenas de comandos que puede llegar a producir ese error, y cuando corro el código sin el bloque de eco local que funciona muy bien:
PTY.spawn(command) {|r,w,pid|}
En cualquier caso, el comando se ejecuta correctamente, pero parece que debian linux no está enviando eof hasta el pty. Las páginas de doc para PTY y IO en ruby-doc no parecen prestar ninguna ayuda aquí.
¿Alguna sugerencia? Gracias.
-vox-
Esto es solo una suposición, pero ¿las readlines están compiladas correctamente en la versión Debian ruby? Si ese es el problema y utiliza rvm, sus notas sobre el problema pueden ser de ayuda: [http://beginrescueend.com/packages/readline/] (http://beginrescueend.com/packages/readline/) – forforf
Eso es un buen pensamiento. No estoy usando rvm en esos servidores, pero sí compilé ruby1.9.3 desde el origen (y en otro servidor 1.9.2). No había considerado que cambiar la readline lib podría ordenarlo. Gracias por la sugerencia. – voxobscuro
libreadline está relacionado con la edición de línea de comandos, historial, etc. (por ejemplo, en irb). No afecta el método IO # readline. Puede compilar Ruby sin soporte de libreadline e IO funcionará como se espera (pero irb será desagradable de usar). –