8 Stimmen

Gibt es eine Möglichkeit, einen bereits laufenden Prozess mit Hilfe von Java zu erhalten/haken/anhängen?

So etwas möchte ich auch machen können:

Process p  = getRunningProcess(pid)

Wenn es einen Weg gibt, spielt es eine Rolle, wie der Prozess erstellt wurde (mit Java, mit Python, von der Shell, etc...)?

5voto

nowaq Punkte 2728

Es ist möglich, einen anderen JVM-Prozess aus einer Java-Anwendung heraus anzuhängen (z.B. um to monitor what's going on and potentially detect problems before they happen ). Sie können dies mit dem Befehl API anhängen . Ich weiß nicht viel über das Anhängen an Nicht-JVM-Prozesse.

String name = ...
List vms = VirtualMachine.list();
for (VirtualMachineDescriptor vmd: vms) {
    if (vmd.displayName().equals(name)) {
        VirtualMachine vm = VirtualMachine.attach(vmd.id());
        String agent = ...
        vm.loadAgent(agent);
        // ...
    }
}

0voto

Krischna Gabriel Punkte 116

Ja, es gibt eine Möglichkeit, jeden Nicht-JVM-Prozess mit ProcessHandle anzuhängen.

Hier ein Beispielcode, der den Rechner startet und schließt, indem er die pid verwendet.

    Process calc = Runtime.getRuntime().exec("gnome-calculator"); 

    Thread.sleep(2000);

    long pid = calc.pid();

    Optional<ProcessHandle> optionalProcessHandle = ProcessHandle.of(pid);
    optionalProcessHandle.ifPresent(ProcessHandle::destroy);

Stellen Sie jedoch sicher, dass Sie Java SE/JDK 11 oder höher verwenden und java.util.Optional; importieren.

In der Dokumentation finden Sie weitere Methoden, die mit ProcessHandle verwendet werden können:
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ProcessHandle.html

Kredite an java.lang.ProcessHandle - Kompilierungsfehler dass sie als Vorlage dafür dient.

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