Java Process.Destroy () не убивает весь процесс - PullRequest
4 голосов
/ 04 июля 2011

У меня есть процесс Java, который запускает программу, используя Runtime.getRuntime (). Exec ("myBin")

этот «myBin» может несколько раз завершить свою работу.

У меня есть поток чтения, чтобы прочитать все выходные данные myBin и его дочерних элементов из InputStream и ErrorStream объекта Process, возвращенного exec ()

Мой вопрос: если для завершения работы требуется слишком много времени, мне нужно завершить процесс и дождаться завершения потока чтения (поток чтения завершится, если он прочитал EOF)

Теперь я обнаружил, что даже если я использую Process.Destroy (), я могу убить только "myBin", внутри себя и всех его потомков. Таким образом, после тайм-аута EOF никогда не достигался, поэтому поток считывателя зависал, пока все дочерние процессы не были остановлены ...

Есть ли способ безопасного уничтожения процесса, и все дочерние процессы запущены Runtime.exec ()

Я нахожусь в Linux, я не думаю о кроссплатформенности.

1 Ответ

1 голос
/ 04 июля 2011

Одним из способов достижения этого было бы использование процесса, который вызывает форк для сохранения списка дочерних pids.Вы можете реализовать обработчик в mybin, который запускает уничтожение также «детей».

Другой вариант - использовать потоки вместо использования вилок.

Основная проблема, почему это не сработаетчто если вы вызовете fork, он создаст новый процесс, который не имеет реальной зависимости от родительского процесса.

...