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