Как программа Java может получить свой собственный идентификатор процесса?

Как мне получить идентификатор моего Java-процесса?

Я 9X_openjdk знаю, что есть несколько хаков, зависящих 9X_processid от платформы, но я бы предпочел более универсальное 9X_java-se решение.

404
2

  • Это должно быть исправлено в JDK9. http://openjdk.java.net/jeps/10 ...
19
Общее количество ответов: 19

Ответ #1

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Не существует независимого от платформы 9X_core-java способа, который мог бы гарантированно работать 9X_jdk во всех реализациях jvm. ManagementFactory.getRuntimeMXBean().getName() выглядит как лучшее 9X_pid (ближайшее) решение и обычно включает PID. Он 9X_openjdk короткий и возможно работает во всех широко используемых 9X_.java реализациях.

В linux+windows возвращает значение 9X_jdk вроде 12345@hostname (12345 — идентификатор процесса). Остерегайтесь, однако, что 9X_jdk according to the docs, нет никаких гарантий относительно этого 9X_.java значения:

Возвращает имя работающей виртуальной 9X_j2se машины Java. возвращаемая строка имени может 9X_core-java быть любой произвольной строкой и виртуальным машинная 9X_jre реализация может выбрать встраивание полезных 9X_java-api для конкретной платформы информация в возвращаемой 9X_java-api строке имени. Каждая работающая виртуальная 9X_j2se машина может иметь другое имя.

В Java 9 можно использовать 9X_java-se новый process API:

long pid = ProcessHandle.current().pid(); 

400
1

  • Это решение действительно хрупкое. См. Ответ о Hyperic Sigar ниже.<p><spa ...

Ответ #2

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Вы можете использовать JNA. К сожалению, пока 9X_oraclejdk нет общего JNA API для получения идентификатора 9X_processid текущего процесса, но каждая платформа довольно 9X_javax проста:

Windows

Убедитесь, что у вас есть jna-platform.jar, затем:

int pid = Kernel32.INSTANCE.GetCurrentProcessId(); 

Unix

Объявить:

private interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class); int getpid (); } 

Затем:

int pid = CLibrary.INSTANCE.getpid(); 

Java 9

В 9X_j2se Java 9 новый process API можно использовать для получения 9X_j2se идентификатора текущего процесса. Сначала 9X_javax вы захватываете дескриптор текущего процесса, затем 9X_jdk запрашиваете PID:

long pid = ProcessHandle.current().pid(); 

129
2

  • Решение `getpid()` также работает для OS X с вызовом JNA библиотеки " ...

Ответ #3

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Вот метод бэкдора, который может работать не 9X_core-java со всеми виртуальными машинами, но должен 9X_java-libraries работать как в Linux, так и в Windows (original example here):

java.lang.management.RuntimeMXBean runtime = java.lang.management.ManagementFactory.getRuntimeMXBean(); java.lang.reflect.Field jvm = runtime.getClass().getDeclaredField("jvm"); jvm.setAccessible(true); sun.management.VMManagement mgmt = (sun.management.VMManagement) jvm.get(runtime); java.lang.reflect.Method pid_method = mgmt.getClass().getDeclaredMethod("getProcessId"); pid_method.setAccessible(true); int pid = (Integer) pid_method.invoke(mgmt); 

63
4

  • очень хорошо, только что проверил, что он работает как на JRockit, так и на ...

Ответ #4

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Попробуйте Sigar. очень обширные API. Лицензия 9X_javax Apache 2

private Sigar sigar; public synchronized Sigar getSigar() { if (sigar == null) { sigar = new Sigar(); } return sigar; } public synchronized void forceRelease() { if (sigar != null) { sigar.close(); sigar = null; } } public long getPid() { return getSigar().getPid(); } 

36
2

  • У вас было бы намного больше гол ...

Ответ #5

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Следующий метод пытается извлечь PID из 9X_processid java.lang.management.ManagementFactory:

private static String getProcessId(final String fallback) { // Note: may fail in some JVM implementations // therefore fallback has to be provided // something like '@', at least in SUN / Oracle JVMs final String jvmName = ManagementFactory.getRuntimeMXBean().getName(); final int index = jvmName.indexOf('@'); if (index < 1) { // part before '@' empty (index = 0) / '@' not found (index = -1) return fallback; } try { return Long.toString(Long.parseLong(jvmName.substring(0, index))); } catch (NumberFormatException e) { // ignore } return fallback; } 

Просто вызовите, например, getProcessId("").

30
1

  • VisualVM использует аналогичный код для получения собственного PID, проверьте com.sun.tools.visualvm.application.jvm.Jvm # ApplicationSupport # createCurrentApplication(). Они являются экспертами, так ч ...

Ответ #6

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Для более старых JVM в Linux ...

private static String getPid() throws IOException { byte[] bo = new byte[256]; InputStream is = new FileInputStream("/proc/self/stat"); is.read(bo); for (int i = 0; i < bo.length; i++) { if ((bo[i] < '0') || (bo[i] > '9')) { return new String(bo, 0, i); } } return "-1"; } 

9X_java-api

25
4

  • Для любопытных, уловка в комментарии @David действительно работает. Кто-нибудь может сказать почему? Какая-то магия в методе `g ...

Ответ #7

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Начиная с Java 9 существует метод Process.getPid(), который 9X_openjdk возвращает собственный идентификатор процесса:

public abstract class Process { ... public long getPid(); } 

Чтобы 9X_j2se получить идентификатор текущего процесса 9X_java-se Java, можно использовать интерфейс ProcessHandle:

System.out.println(ProcessHandle.current().pid()); 

21
1

  • Не могли бы вы объяснить, как получить экземпляр процесса для текущего за ...

Ответ #8

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Вы можете проверить мой проект: JavaSysMon на GitHub. Он 9X_pid предоставляет идентификатор процесса и множество 9X_j2se других вещей (использование ЦП, использование 9X_java-se памяти) кроссплатформенных (в настоящее 9X_pid время Windows, Mac OSX, Linux и Solaris)

18
0

Ответ #9

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

java.lang.management.ManagementFactory.getRuntimeMXBean().getName().split("@")[0] 
9X_processid
12
0

Ответ #10

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

В Scala:

import sys.process._ val pid: Long = Seq("sh", "-c", "echo $PPID").!!.trim.toLong 

Это должно дать вам обходной путь 9X_java в системах Unix до тех пор, пока не будет 9X_oraclejdk выпущена Java 9. (Я знаю, что вопрос касался 9X_java-se Java, но, поскольку для Scala нет эквивалентного 9X_jre вопроса, я хотел оставить его для пользователей 9X_openjdk Scala, которые могут столкнуться с тем же 9X_oraclejdk вопросом.)

10
0

Ответ #11

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Для полноты картины в Spring Boot есть оболочка для

String jvmName = ManagementFactory.getRuntimeMXBean().getName(); return jvmName.split("@")[0]; 

решение. Если 9X_j2se требуется целое число, его можно суммировать 9X_oraclejdk до однострочного:

int pid = Integer.parseInt(ManagementFactory.getRuntimeMXBean().getName().split("@")[0]); 

Если кто-то уже использует 9X_.java Spring boot, он / она может использовать 9X_openjdk org.springframework.boot.ApplicationPid

ApplicationPid pid = new ApplicationPid(); pid.toString(); 

Метод toString() печатает pid или '???'.

Предостережения 9X_oraclejdk при использовании ManagementFactory уже 9X_processid обсуждаются в других ответах.

9
0

Ответ #12

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

public static long getPID() { String processName = java.lang.management.ManagementFactory.getRuntimeMXBean().getName(); if (processName != null && processName.length() > 0) { try { return Long.parseLong(processName.split("@")[0]); } catch (Exception e) { return 0; } } return 0; } 
9X_java-libraries
7
0

Ответ #13

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Я добавляю это в дополнение к другим решениям.

с Java 10, чтобы получить process id

final RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean(); final long pid = runtime.getPid(); out.println("Process ID is '" + pid); 

9X_java-libraries

6
0

Ответ #14

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Последнее, что я обнаружил, это то, что 9X_core-java существует системное свойство под названием sun.java.launcher.pid, которое доступно, по 9X_java-se крайней мере, в Linux. Я планирую использовать 9X_java-libraries это, а если не будет найдено, использовать 9X_pid JMX bean.

5
0

Ответ #15

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Это зависит от того, откуда вы ищете информацию.

Если 9X_java-api вы ищете информацию из консоли, вы можете 9X_oraclejdk использовать команду jps. Команда выдает 9X_java результат, аналогичный команде Unix ps, и 9X_openjdk поставляется с JDK, поскольку я считаю, что 9X_java 1.5

Если вы смотрите на процесс, RuntimeMXBean 9X_jre (как сказал Wouter Coekaerts), вероятно, ваш 9X_.java лучший выбор. Вывод из getName() в Windows 9X_java с использованием Sun JDK 1.6 u7 имеет вид 9X_java-api [PROCESS_ID]@[MACHINE_NAME]. Однако вы можете 9X_processid попытаться выполнить jps и проанализировать 9X_j2se результат:

String jps = [JDK HOME] + "\\bin\\jps.exe"; Process p = Runtime.getRuntime().exec(jps); 

Если запустить без параметров, результатом 9X_pid должен быть идентификатор процесса, за которым 9X_jre следует имя.

4
1

  • Инструмент JPS использует библиотеку jvmstat, входящую в состав tools.jar. Посмотрите мой при ...

Ответ #16

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Это код JConsole, который потенциально использует 9X_jre jps и VisualVM. Он использует классы из Пакет 9X_oraclejdk sun.jvmstat.monitor.* из tool.jar.

package my.code.a003.process; import sun.jvmstat.monitor.HostIdentifier; import sun.jvmstat.monitor.MonitorException; import sun.jvmstat.monitor.MonitoredHost; import sun.jvmstat.monitor.MonitoredVm; import sun.jvmstat.monitor.MonitoredVmUtil; import sun.jvmstat.monitor.VmIdentifier; public class GetOwnPid { public static void main(String[] args) { new GetOwnPid().run(); } public void run() { System.out.println(getPid(this.getClass())); } public Integer getPid(Class
 mainClass) { MonitoredHost monitoredHost; Set activeVmPids; try { monitoredHost = MonitoredHost.getMonitoredHost(new HostIdentifier((String) null)); activeVmPids = monitoredHost.activeVms(); MonitoredVm mvm = null; for (Integer vmPid : activeVmPids) { try { mvm = monitoredHost.getMonitoredVm(new VmIdentifier(vmPid.toString())); String mvmMainClass = MonitoredVmUtil.mainClass(mvm, true); if (mainClass.getName().equals(mvmMainClass)) { return vmPid; } } finally { if (mvm != null) { mvm.detach(); } } } } catch (java.net.URISyntaxException e) { throw new InternalError(e.getMessage()); } catch (MonitorException e) { throw new InternalError(e.getMessage()); } return null; } } 

Есть несколько уловок:

  • tool.jar - это библиотека, распространяемая с Oracle JDK, но не с JRE!
  • Вы не можете получить tool.jar из репозитория Maven; настроить его с помощью Maven немного сложно
  • tool.jar, вероятно, содержит платформенно-зависимый (собственный?) код, поэтому его нелегко распространяемый
  • Предполагается, что все (локальные) запущенные приложения JVM "отслеживаются". Это выглядит как что из Java 6 все приложения обычно (если вы не настроили противоположное)
  • Вероятно, это работает только для Java 6+.
  • Eclipse не публикует основной класс, поэтому вы не сможете легко получить Eclipse PID Ошибка в MonitoredVmUtil?

ОБНОВЛЕНИЕ: я 9X_java-se только что дважды проверил, что JPS использует 9X_processid этот способ, то есть библиотеку Jvmstat 9X_javax (часть tool.jar). Таким образом, нет необходимости 9X_openjdk вызывать JPS как внешний процесс, вызывайте 9X_jdk библиотеку Jvmstat напрямую, как показывает 9X_java мой пример. Таким образом вы также можете 9X_javax получить список всех JVM, запущенных на 9X_java-api локальном хосте. См. JPS source code:

4
0

Ответ #17

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

На основе answer Ашвина Джаяпракаша (+1) о лицензированном 9X_java-api Apache 2.0 SIGAR, вот как я использую его для 9X_java получения только PID текущего процесса:

import org.hyperic.sigar.Sigar; Sigar sigar = new Sigar(); long pid = sigar.getPid(); sigar.close(); 

Хотя 9X_java он работает не на всех платформах, он работает 9X_pid на Linux, Windows, OS X and various Unix platforms as listed here.

2
0

Ответ #18

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Я знаю, что это старый поток, но я хотел 9X_java-se вызвать этот API для получения PID (а также 9X_pid других манипуляций с процессом Java во время 9X_java-api выполнения), добавляемого к классу Process 9X_java-libraries в JDK 9: http://openjdk.java.net/jeps/102

2
1

  • Вау, это было быстро. На это ушло всего около семи лет! 😃<p><s ...

Ответ #19

Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?

Вы можете попробовать getpid() в JNR-Posix.

Он имеет оболочку 9X_pid POSIX для Windows, которая вызывает getpid() из 9X_java-api libc.

1
0