Как программа 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