Ist es möglich, eine Java Virtual Machine von einer anderen virtuellen Maschine zu töten?

StackOverflow https://stackoverflow.com/questions/63758

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe eine Java-Anwendung, die eine andere Java-Anwendung startet. Der Launcher hat einen Watchdog-Timer und erhält regelmäßig Benachrichtigungen von der zweiten VM. Wenn jedoch keine Benachrichtigungen dann die zweite virtuelle Maschine empfangen werden sollte und der Launcher getötet werden einige zusätzliche Aufräumarbeiten durchführen.

Die Frage ist, gibt es eine Möglichkeit, dies mit nur Java zu tun? Bisher habe ich einige native Methoden verwenden, um diesen Vorgang auszuführen, und es ist irgendwie hässlich.

Danke!

War es hilfreich?

Lösung

ich etwas fehlen kann, aber können Sie die destroy() Methode auf die Process Objekt von Runtime.exec() ?

Andere Tipps

Sie können mit java.lang.Process tun, was Sie wollen. Sobald Sie den verschachtelten Prozess erstellt und haben einen Verweis auf den Prozess Beispiel können Sie Verweise auf seinen Standard raus und Ströme irren. Sie können diese in regelmäßigen Abständen überwachen, und rufen .Destroy (), wenn Sie den Prozess beenden möchten. Das Ganze etwas könnte wie folgt aussehen:

Process nestedProcess = new ProcessBuilder("java mysubprocess").start();
InputStream nestedStdOut = nestedProcess.getInputStream(); //kinda backwards, I know
InputStream nestedStdErr = nestedProcess.getErrorStream();
while (true) {
    /*
       TODO: read from the std out or std err (or get notifications some other way)
       Then put the real "kill-me" logic here instead of if (false)
    */
    if (false) {
        nestedProcess.destroy();
        //perform post-destruction cleanup here
        return;
    }

    Thread.currentThread().sleep(1000L); //wait for a bit
}

Hope, das hilft,

Sean

Sie können auch einen Service (via Sackleinen, Hessische, usw.) auf der zweiten JVM veröffentlichen, die System.exit () und verbrauchen sie von der Watchdog-JVM aufruft. Wenn Sie nur die zweite JVM herunter wollen nach unten, wenn es aufhört, diese periodischen Benachrichtigungen zu versenden, kann es nicht in einem Zustand sein, um den Service-Aufruf zu reagieren.

Der Aufruf von Shell-Befehlen mit java.lang.Runtime.exec () ist wahrscheinlich die beste Wahl.

Der üblicher Weg, dies zu tun ist Process.destroy () nennen ... aber es ist eine unvollständige Lösung ist da, wenn sie auf * nichts die Sonne JVM mit Karten zerstören auf ein SIGTERM die nicht garantiert ist, den Prozess zu beenden (für dass Sie benötigen SIGKILL als auch). Das Nettoergebnis ist, dass Sie nicht wirklich Prozessmanagement mit Hilfe von Java tun können.

Es gibt einige offene Bugs zu diesem Thema finden Sie unter: Link-Text

java.lang.Process hat eine waitFor () -Methode zu warten, ein Verfahren zu sterben, und eine Methode destroy () die subprocess zu töten.

OK die Verdrehung des Kerns ist wie folgt:

Ich war mit dem Prozess-API die zweite virtuelle Maschine zu schließen, aber es würde nicht funktionieren.

Der Grund dafür ist, dass meine zweite Anwendung ist eine Eclipse-RCP-Anwendung, und ich leitete sie der eclipse.exe Launcher mit enthalten.

Das bedeutet jedoch, dass, dass der Prozess API destroy () Methode wird das eclipse.exe Prozessziel. diesen Prozess zu töten lässt der Java-Prozess unbeschadet. Also einer meiner Kollegen hier schrieb eine kleine Anwendung, die die richtige Anwendung töten.

So eine der Lösungen den Prozess API zu verwenden (und redundante Mittel Schritte entfernen) ist mit dem Eclipse-Abschuß wegzuzukommen, meine erste virtuelle Maschine all seine Funktionalität duplizieren.

Ich glaube, ich muss an die Arbeit.

Es soll möglich sein, das zu tun, java.lang.Runtime.exec und Shell-Befehle.

Sie können den Java-Code, die Plattform zur Laufzeit erkennen und die Plattform der Prozess zu töten Befehl abfeuern. Das ist wirklich eine Verfeinerung Ihrer aktuellen Lösung.

Es gibt auch Prozess .Destroy () , wenn Sie mit der Process API

Nicht gerade Prozessmanagement, aber man kann einen RMI-Server in der Java Virtual Machine starten Sie starten, und bindet, um ein Fern Beispiel mit einem Verfahren, das tut, was Bereinigung erforderlich und fordert System.exit (). Der erste vm dann könnte die zweite vm, die Remote-Methode zum Herunterfahren aufrufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top