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.

9voto

AntiTiming Punkte 1734

Der Vollständigkeit halber gibt es einen Wrapper in Spring Boot に対して

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

Lösung. Wird eine ganze Zahl benötigt, so kann diese zum Einzeiler addiert werden:

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

Wenn jemand bereits Spring Boot verwendet, könnte er/sie org.springframework.boot.ApplicationPid

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

Die Methode toString() gibt die pid oder '???' aus.

Die Vorbehalte gegen die Verwendung der ManagementFactory wurden bereits in anderen Antworten erörtert.

7voto

JaskeyLam Punkte 14171
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;
}

6voto

mrsrinivas Punkte 30892

Ich füge dies als Ergänzung zu anderen Lösungen hinzu.

mit Java 10, um die process id

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

5voto

Jared Punkte 51

Das Neueste, was ich herausgefunden habe, ist, dass es eine Systemeigenschaft genannt. sun.java.launcher.pid das zumindest unter Linux verfügbar ist. Mein Plan ist es, das zu verwenden und wenn es nicht gefunden wird, die JMX bean .

4voto

Espinosa Punkte 2272

Dies ist der Code, den JConsole und möglicherweise auch jps und VisualVM verwenden. Er verwendet Klassen aus sun.jvmstat.monitor.* Paket, von 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<Integer> 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;
    }
}

Es gibt nur wenige Haken:

  • El tool.jar ist eine Bibliothek, die mit Oracle JDK, aber nicht mit JRE verteilt wird!
  • Sie können nicht bekommen tool.jar aus dem Maven Repo; die Konfiguration mit Maven ist ein wenig knifflig
  • El tool.jar enthält wahrscheinlich plattformabhängigen (nativen?) Code und ist daher nicht leicht verteilbar
  • Es läuft unter der Annahme, dass alle (lokal) laufenden JVM-Anwendungen "überwachbar" sind. Es sieht so aus dass ab Java 6 alle Anwendungen dies generell sind (es sei denn, Sie konfigurieren aktiv das Gegenteil)
  • Es funktioniert wahrscheinlich nur für Java 6+
  • Eclipse veröffentlicht die Hauptklasse nicht, so dass Sie die Eclipse PID nicht einfach erhalten können. Fehler in MonitoredVmUtil?

UPDATE: Ich habe soeben doppelt überprüft, dass JPS diesen Weg nutzt, nämlich die Jvmstat-Bibliothek (Teil von tool.jar). Es besteht also keine Notwendigkeit, JPS als externen Prozess aufzurufen, sondern die Jvmstat-Bibliothek direkt aufzurufen, wie mein Beispiel zeigt. Sie können auf diese Weise auch eine Liste aller JVMs erhalten, die auf localhost laufen. Siehe JPS Quellcode :

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