Воссоздать объект процесса Java из известного PID

У меня есть программа (какой-то Process Monitor), которая запускает несколько программ с помощью ProcessBuilder. Когда я запускаю этот ProcessBuilder (для каждой программы), я могу запустить его, и он даст мне объект Process. Имея этот объект Process в памяти, я могу даже останавливать свои программы с помощью destroy() или destroyForcably().

Теперь, если моя основная программа (Process Monitor) выйдет из строя, и я перезапущу ее, а также скажем, что у меня есть PID каждой программы, которую я запускаю, как я могу воссоздать объект Process с этим PID? Я не вижу эту опцию в классе Process или в ProcessBuilder (хотя я думаю, что нам понадобится ProcessLoader вместо Builder).

Есть ли способ сделать это?

Чтобы проиллюстрировать, что я хочу:

long pid = getPid();
Process process = new Process(pid);
//or
Process process = new Process();
process.load(pid);

person Lusheez    schedule 14.10.2020    source источник
comment
Ну, насколько я знаю, ОС назначает PID, поэтому, если ОС не позволяет вам определить собственный pid (я сомневаюсь, что такая опция существует), вы просто не сможете этого сделать. Кстати, чего вы на самом деле пытаетесь достичь? Почему бы вам просто не создать другой процесс с другим PID на случай сбоя?   -  person Thomas    schedule 14.10.2020
comment
Дело в том, что мой монитор процессов может дать сбой, но это не будет означать, что другие мои программы тоже будут падать, поэтому, когда я перезапускаю свой монитор процессов, я хотел бы видеть статусы моих программ напрямую, без необходимости перезапуска всех. их. Я бы хотел сделать что-то вроде Process process = new Process(pid); это просто свяжет существующий процесс в ОС с java-объектом Process.   -  person Lusheez    schedule 14.10.2020


Ответы (1)


Итак, если кому-то когда-нибудь понадобится что-то вроде меня, он может использовать ProcessHandle.

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ProcessHandle.html

long pid = getPid();
ProcessHandle process;
Optional<ProcessHandle> possibleProcess = ProcessHandle.of(pid);
if(possibleProcess.isPresent()) process = possibleProcess.get();

Вы получаете Stream, который вы можете либо собирать, либо обрабатывать дальше, если хотите, а ProcessHandle обрабатывает тот же набор операций, что и Process (onExit(), destroy(), destroyForcily() и т. д.)

person Lusheez    schedule 22.10.2020