Я использую Java-класс ProcessBuilder для запуска внешнего процесса. Процесс не должен завершаться раньше, чем программа Java; он должен оставаться в живых в режиме команда / ответ.
Я знаю, что потоки процесса могут легко «застрять», если пренебречь, поэтому я сделал следующее:
Программа считывает объединенные потоки вывода и ошибок процесса в потоке «считывателя» и использует поток «записывающего» для управления командами. Поток читателя блокирует чтение символов из выходных данных процесса, буферизует их в строки и отправляет результаты. Поток писателя записывает полные «командные» строки через PrintWriter; он использует очередь, чтобы гарантировать, что никакие две записи команд не «слишком близки» (в настоящее время 100 мс), и что никакая новая команда не записывается до завершения вывода предыдущей команды. Я также вызываю flush () и checkError () после каждого println ().
Эта схема отлично работает в течение нескольких секунд или минут, затем поток чтения зависает при блокировке чтения (). Никаких ошибок, никаких исключений, никаких выходных данных процесса. После этого ничто не оживит внешний процесс (кроме перезапуска). (Кстати, это происходит как в Linux, так и в Windows.)
Я рассмотрел код и контрольные примеры в Jakarta Commons Exec и в Plexus Utils http://plexus.codehaus.org/plexus-utils/, но (a) ни один из них не дает пример использования долгоживущего Процесса, а (b) ни делать что-то принципиально отличное от того, что я описал.
Кто-нибудь знает, что здесь происходит, пожалуйста?
Спасибо!