Страницы

Поиск по вопросам

суббота, 30 марта 2019 г.

Можно ли средствами Java убить дочерние процессы процесса, созданного с помощью ProcessBuilder?

Если создать процесс
ProcessBuilder builder = new ProcessBuilder("command"); final Process process = builder.start();
то его можно будет убить с помощью: process.destroy();
Но что, если этот command наплодит кучу других процессов? process.destroy(); уже будет не в силах убить их. И они останутся в памяти.
При этом, если из командной строки сделать Ctrl+C, то дочерние процессы тоже завершатся.
В сети много вопросов на эту тему (большинство из них старые) и почти все ответы говорят о том, что это невозможно сделать средствами JVM - нужно обращаться к ОС. Решил задать вопрос, в надежде на то, что это всё же стало возможным с появлением Java 8. Хочется получить решение, не зависимое от ОС.
Возможно ли на сегодняшний день средствами Java убить дочерние процессы процесса, созданного с помощью ProcessBuilder, не манипулируя напрямую с командами ОС? Если возможно, то как это реализовать? Если нет, то ожидается ли такая возможность в Java 9?
UPDATE
Хочу ещё раз выделить то, что я не ищу решения, зависящие от ОС. По этой ссылке можно прочитать о том, как искать PID процесса в Unix и Windows. Потом можно будет обратиться к терминалу с соответствующей командой для "убийства" процесса.
Это не является темой данного вопроса.


Ответ

В версиях Java до 8й включительно инструментарий для работы с процессами был довольно скудным.
Но если ознакомиться, с JEP 102: Process API Updates (который реализуется в рамках Java 9), то мы увидим, что Brian Goetz говорит нам о следующих вещах:
Возможность получить pid процесса JVM и pid-ы процессов, запущенных средствами API. Возможность получить список запущенных в системе процессов, включая их pid, состояние, наименование и, возможно, потребление ресурсов. Возможность взаимодействовать с деревьями процессов, а именно прекращать работу целого дерева. Возможность взаимодействовать с сотнями дочерних процессов, возможно, мультиплексируя потоки вывода и ошибок, чтобы избежать создания отдельной нити (thread) на каждый процесс.
Все эти радости уже можно потрогать в 9ке: см. интерфейс ProcessHandle
long getPid() static Stream allProcesses() и ProcessHandle.Info info() Stream descendants()

Комментариев нет:

Отправить комментарий