Javaでプロセスを強制終了する最良の方法は何ですか?
PIDを取得してからRuntime.exec()
で殺しますか?
destroyForcibly()
を使用しますか?
これら2つの方法の違いは何ですか?他の解決策はありますか?
強制終了するプロセスがアプリケーションによって開始されている場合
次に、おそらくそれへの参照があります(ProcessBuilder.start()
またはRuntime.exec()
は両方とも参照を返します)。この場合、単にp.destroy()
を呼び出すことができます。私はこれが最もきれいな方法だと思います(しかし注意してください:p
によって開始されたサブプロセスは生き続けるかもしれません、チェックしてください http://bugs.Sun.com/bugdatabase/view_bug.do?bug_id= 4770092 詳細については)。
destroyForcibly
は、destroy()
が特定のタイムアウト後に失敗した場合にのみ使用する必要があります。手短に
destroy()
でプロセスを終了しますdestroyForcibly()
でそれを殺します強制終了したいプロセスが外部の場合
その場合、選択肢はあまりありません。OSAPI(Runtime.exec
)。 Windowsでは、呼び出すプログラムはtaskkill.exe
、MacおよびLinuxではkill
を試すことができます。
https://github.com/zeroturnaround/zt-exec/issues/19 と Javaを使用したプロセスの終了 と http:// invisiblecomputer.wonderhowto.com/how-to/code-simple-Java-app-kill-any-process-after-specified-time-0133513/ 詳細については.
メインプロセスを強制終了する場合は、Javaコードが開始されました。System.exit()
を使用することをお勧めします。メリットは次のとおりです。 Javaのシステム出口 。
基本的に、System.exit()
はシャットダウンフックを実行します。これにより、プロセスが強制終了される前に、作業を完了していない可能性のある非デーモンプロセスが強制終了されます。これはそれを行うためのクリーンな方法です。
プロセスが自分のものではない場合、この回答で説明されているように、オペレーティングシステムに依存してこの作業を行う必要があります: Javaを使用したプロセスの終了
その場合、__nixでのRuntime.exec()
killの提案は適切な方法です。
ここで、destroyForcibly()
に関しては、通常、プロセスAPIのProcessBuilder.start()
またはRuntime.exec()
で開始されたと思われるJavaコードによって生成された子プロセス上で呼び出します。
私のために働いたのはSystem.exit(0)です。まだ実行中のすべてのプロセスとコンポーネントを閉じるため、うまくいきます
In Java 8ソースコード
_public Process destroyForcibly() {
destroy();
return this;
}
_
destroyForcibly
は、Java 8.のdestroy
と等しいと言いたいだけです。
したがって、destroy
メソッドを呼び出した後、プロセスがまだ動作している場合は、pidでプロセスを強制終了する必要があります。 Java 9+、を呼び出してProcess.pid()
メソッドを呼び出すだけで、pidを簡単に取得できます。