423 Stimmen

Wie kann ein Java-Programm seine eigene Prozess-ID erhalten?

Wie erhalte ich die Kennung meines Java-Prozesses?

Ich weiß, dass es mehrere plattformabhängige Hacks gibt, aber ich würde eine allgemeinere Lösung vorziehen.

418voto

Wouter Coekaerts Punkte 8775

Es gibt keinen plattformunabhängigen Weg, der garantiert in allen jvm-Implementierungen funktioniert. ManagementFactory.getRuntimeMXBean().getName() sieht nach der besten (nächstgelegenen) Lösung aus und beinhaltet in der Regel den PID. Es ist kurz, und wahrscheinlich funktioniert in jeder weit verbreiteten Implementierung.

Unter linux+Windows wird ein Wert wie "12345@hostname" ( 12345 ist die Prozess-ID). Beachten Sie jedoch, dass laut den Unterlagen gibt es keine Garantien für diesen Wert:

Gibt den Namen der laufenden virtuellen Java-Maschine zurück. Die zurückgegebene Namensstring kann ein beliebiger String sein und eine Java Virtual Machine Machine-Implementierung kann plattformspezifische nützliche Informationen Informationen in den zurückgegebenen Namensstring einbetten. Jede laufende virtuelle Maschine kann einen anderen Namen haben.

In Java 9 die neue Prozess-API verwendet werden können:

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

131voto

Luke Quinane Punkte 16188

Sie könnten verwenden JNA . Leider gibt es noch keine gemeinsame JNA-API, um die aktuelle Prozess-ID zu erhalten, aber jede Plattform ist ziemlich einfach:

Windows

Stellen Sie sicher, dass Sie jna-platform.jar dann:

int pid = Kernel32.INSTANCE.GetCurrentProcessId();

Unix

Erklären:

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

Dann:

int pid = CLibrary.INSTANCE.getpid();

Java 9

Unter Java 9 wird die neue Prozess-API kann verwendet werden, um die aktuelle Prozess-ID zu erhalten. Zuerst wird ein Handle auf den aktuellen Prozess geholt, dann wird die PID abgefragt:

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

63voto

Brad Mace Punkte 26337

Hier ist eine Hintertür-Methode, die könnte funktioniert nicht mit allen VMs, sollte aber sowohl unter Linux als auch unter Windows funktionieren ( Originalbeispiel hier ):

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);

36voto

Ashwin Jayaprakash Punkte 2118

Versuchen Sie Sigar . sehr umfangreiche APIs. Apache 2 Lizenz.

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();
}

30voto

Martin Punkte 1785

Mit der folgenden Methode wird versucht, die PID aus 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 '<pid>@<hostname>', 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;
}

Einfach anrufen getProcessId("<PID>") zum Beispiel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X