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.
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.
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();
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:
Stellen Sie sicher, dass Sie jna-platform.jar
dann:
int pid = Kernel32.INSTANCE.GetCurrentProcessId();
Erklären:
private interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class);
int getpid ();
}
Dann:
int pid = CLibrary.INSTANCE.getpid();
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();
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);
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();
}
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 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.