it-swarm.com.de

Der richtige Weg, um einen Prozess in Java zu beenden

Was ist der beste Weg, um einen Prozess in Java zu beenden?

Bekomme die PID und töte sie dann mit Runtime.exec()?

Verwenden Sie destroyForcibly()

Was ist der Unterschied zwischen diesen beiden Methoden und gibt es andere Lösungen?

14
Kariamoss

Wenn der Prozess, den Sie beenden möchten, von Ihrer Anwendung gestartet wurde

Dann haben Sie wahrscheinlich einen Verweis darauf (ProcessBuilder.start() oder Runtime.exec() geben beide einen Verweis zurück). In diesem Fall können Sie einfach p.destroy() aufrufen. Ich denke, dies ist der sauberste Weg (aber seien Sie vorsichtig: Unterprozesse, die von p gestartet werden, können am Leben bleiben. Weitere Informationen finden Sie in http://bugs.Sun.com/bugdatabase/view_bug.do?bug_id=4770092 Info).

Die destroyForcibly sollte nur verwendet werden, wenn destroy() nach einem bestimmten Timeout fehlgeschlagen ist. In einer Nussschale

  1. prozess mit destroy() beenden 
  2. lassen Sie den Prozess mit einem angemessenen Timeout ordnungsgemäß beenden 
  3. töte es mit destroyForcibly(), falls der Prozess noch lebt

Wenn der Prozess, den Sie beenden möchten, extern ist

Dann haben Sie keine große Auswahl: Sie müssen die OS-API (Runtime.exec) durchlaufen. Unter Windows ist das aufzurufende Programm taskkill.exe, während Sie unter Mac und Linux kill ausprobieren können.


Schauen Sie sich https://github.com/zeroturnaround/zt-exec/issues/19 und Prozess mit Java beenden und http: //invisiblecomputer.wonderhowto .com/how-to/code-simple-Java-app-kill-any-process-after-time-0133513 / für weitere Informationen.

16
Derlin

Wenn Sie versuchen, den Hauptprozess zu beenden, an dem Ihr Java-Code gestartet wurde, würde ich vorschlagen, System.exit() zu verwenden. Die Vorteile werden hier erläutert: Wann sollen wir den System-Exit in Java aufrufen .

Im Wesentlichen führt System.exit() Hooks zum Herunterfahren aus, die sicherstellen, dass alle abhängigen Nicht-Daemon-Prozesse, deren Arbeit möglicherweise noch nicht abgeschlossen ist, vor dem Abbruch des Prozesses abgebrochen werden. Dies ist der saubere Weg, dies zu tun.

Wenn der Prozess nicht Ihnen gehört, müssen Sie sich auf das Betriebssystem verlassen, um diese Arbeit für Sie auszuführen, wie in dieser Antwort beschrieben: Prozess mit Java beenden

In diesem Fall wäre Ihr Vorschlag von Runtime.exec() ein Kill on * nix ein anständiger Weg.

Was destroyForcibly() betrifft, werden Sie normalerweise einen untergeordneten Prozess aufrufen, der durch Ihren Java-Code hervorgerufen wird, der vermutlich mit dem Prozess apis ProcessBuilder.start() oder Runtime.exec() gestartet wurde.

6
nlloyd

in Java 8-Quellcode

public Process destroyForcibly() {
    destroy();
    return this;
}

vielen Dank für Ihren Rat, tut mir leid für mein Englisch.
Ich möchte nur sagen, dass das destroyForcibly gleich dem destroy in Java 8 ist
Sie sollten also versuchen, den Prozess durch pid zu beenden, wenn der Prozess noch aktiv ist, nachdem Sie die Methode destroy aufgerufen haben
Sie können pid leicht erhalten, wenn Sie Java 9 + verwenden. Rufen Sie einfach die Process.pid()-Methode auf

1
钱宇豪

das System, das für mich funktioniert hat, ist System.exit (0); Es funktioniert gut, da es alle noch laufenden Prozesse und Komponenten schließt

0
Meir Bookatz