web-dev-qa-db-ja.com

Javaでプロセスを強制終了する正しい方法

Javaでプロセスを強制終了する最良の方法は何ですか?

PIDを取得してからRuntime.exec()で殺しますか?

destroyForcibly()を使用しますか?

これら2つの方法の違いは何ですか?他の解決策はありますか?

15
Kariamoss

強制終了するプロセスがアプリケーションによって開始されている場合

次に、おそらくそれへの参照があります(ProcessBuilder.start()またはRuntime.exec()は両方とも参照を返します)。この場合、単にp.destroy()を呼び出すことができます。私はこれが最もきれいな方法だと思います(しかし注意してください:pによって開始されたサブプロセスは生き続けるかもしれません、チェックしてください http://bugs.Sun.com/bugdatabase/view_bug.do?bug_id= 4770092 詳細については)。

destroyForciblyは、destroy()が特定のタイムアウト後に失敗した場合にのみ使用する必要があります。手短に

  1. destroy()でプロセスを終了します
  2. プロセスが適切なタイムアウトで正常に終了できるようにします
  3. プロセスがまだ生きているなら、destroyForcibly()でそれを殺します

強制終了したいプロセスが外部の場合

その場合、選択肢はあまりありません。OSAPI(Runtime.exec)。 Windowsでは、呼び出すプログラムはtaskkill.exe、MacおよびLinuxではkillを試すことができます。


https://github.com/zeroturnaround/zt-exec/issues/19Javaを使用したプロセスの終了http:// invisiblecomputer.wonderhowto.com/how-to/code-simple-Java-app-kill-any-process-after-specified-time-0133513/ 詳細については.

18
Derlin

メインプロセスを強制終了する場合は、Javaコードが開始されました。System.exit()を使用することをお勧めします。メリットは次のとおりです。 Javaのシステム出口

基本的に、System.exit()はシャットダウンフックを実行します。これにより、プロセスが強制終了される前に、作業を完了していない可能性のある非デーモンプロセスが強制終了されます。これはそれを行うためのクリーンな方法です。

プロセスが自分のものではない場合、この回答で説明されているように、オペレーティングシステムに依存してこの作業を行う必要があります: Javaを使用したプロセスの終了

その場合、__nixでのRuntime.exec() killの提案は適切な方法です。

ここで、destroyForcibly()に関しては、通常、プロセスAPIのProcessBuilder.start()またはRuntime.exec()で開始されたと思われるJavaコードによって生成された子プロセス上で呼び出します。

7
nlloyd

私のために働いたのはSystem.exit(0)です。まだ実行中のすべてのプロセスとコンポーネントを閉じるため、うまくいきます

1
Meir Bookatz

In Java 8ソースコード

_public Process destroyForcibly() {
    destroy();
    return this;
}
_

destroyForciblyは、Java 8.のdestroyと等しいと言いたいだけです。
したがって、destroyメソッドを呼び出した後、プロセスがまだ動作している場合は、pidでプロセスを強制終了する必要があります。 Java 9+、を呼び出してProcess.pid()メソッドを呼び出すだけで、pidを簡単に取得できます。

1
钱宇豪