Как программа Java может получить свой собственный идентификатор процесса?
Как мне получить идентификатор моего Java-процесса?
Я знаю, что существует несколько зависящих от платформы взломов, но я бы предпочел более универсальное решение.
Переведено автоматически
Ответ 1
Не существует платформенно-независимого способа, который гарантированно работал бы во всех реализациях jvm. ManagementFactory.getRuntimeMXBean().getName() выглядит как лучшее (ближайшее) решение и обычно включает PID. Он короткий и, вероятно, работает во всех широко используемых реализациях.
В Linux + Windows он возвращает значение типа "12345@hostname" (12345 являющееся идентификатором процесса). Имейте в виду, что, согласно документации, нет никаких гарантий относительно этого значения:
Возвращает имя, представляющее запущенную виртуальную машину Java. Возвращаемая строка имени может быть любой произвольной строкой, и реализация виртуальной машины Java может встроить полезную информацию для конкретной платформы в возвращаемую строку имени. Каждая запущенная виртуальная машина может иметь другое имя.
Вы могли бы использовать JNA. К сожалению, пока нет общего JNA API для получения текущего идентификатора процесса, но каждая платформа довольно проста:
В Java 9 для получения текущего идентификатора процесса можно использовать новый process API. Сначала вы получаете дескриптор текущего процесса, затем запрашиваете PID:
longpid= ProcessHandle.current().pid();
Ответ 3
Вот бэкдор-метод, который может работать не со всеми виртуальными машинами, но должен работать как в Linux, так и в Windows (оригинальный пример здесь):