Piszę kod, który pobiera plik, przekazuje ten plik do jednego z kilku plików binarnych do przetworzenia i monitoruje proces konwersji pod kątem błędów. Napisałem i przetestowałem następującą procedurę w systemie OSX, ale system Linux zawiedzie z powodów, o których nie wiem.Ruby na Linux PTY odchodzi bez EOF, podnosi 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
}
Komenda który biegnie waha się całkiem sporo, a kod przy znaku ## został uproszczony do lokalnego echa w próbie debugowania problemu. Polecenie zostanie wykonane, a skrypt wypisze oczekiwane wyniki w terminalu, a następnie zgłasza wyjątek.
Błąd produkuje na systemach Debian jest: Errno::EIO (Input/output error - /dev/pts/0):
Wszystkie ciągi poleceń mogę wymyślić produkować ten błąd, a kiedy uruchomić kod bez lokalnego bloku echa działa dobrze:
PTY.spawn(command) {|r,w,pid|}
W obu przypadkach sama komenda działa poprawnie, ale wygląda na to, że debian linux nie wysyła euf do góry. Strony doc dla PTY i IO na ruby-doc nie wydają się tutaj udzielać żadnej pomocy.
Wszelkie sugestie? Dzięki.
-vox-
To tylko przypuszczenie, ale czy linie są poprawnie wkompilowane w wersję rubinową Debiana? Jeśli to jest problem i używasz rvm, ich uwagi dotyczące problemu mogą być pomocne: [http://beginrescueend.com/packages/readline/] (http://beginrescueend.com/packages/readline/) – forforf
Thats dobra myśl. Nie używam rvm na tych serwerach, ale skompilowałem ruby1.9.3 ze źródła (i na innym serwerze 1.9.2). Nie sądziłem, że zmiana biblioteki readline może go rozwiązać. Dzieki za sugestie. – voxobscuro
libreadline dotyczy edycji wiersza poleceń, historii itp. (Np. Nie wpływa to na metodę readline IO #. Możesz skompilować Ruby bez obsługi libreadline, a IO będzie działać zgodnie z oczekiwaniami (ale irb będzie nieprzyjemny w użyciu). –