The right way to kill a process in Java
Solution 1:
If the process you want to kill has been started by your application
Then you probably have a reference to it (ProcessBuilder.start()
or Runtime.exec()
both return a reference). In this case, you can simply call p.destroy()
. I think this is the cleanest way (but be careful: sub-processes started by p
may stay alive, check Process.destroy does not kill multiple child processes for more info).
The destroyForcibly
should only be used if destroy()
failed after a certain timeout. In a nutshell
- terminate process with
destroy()
- allow process to exit gracefully with reasonable timeout
- kill it with
destroyForcibly()
if process is still alive
If the process you want to kill is external
Then you don't have much choice: you need to pass through the OS API (Runtime.exec
). On Windows, the program to call will be taskkill.exe
, while on Mac and Linux you can try kill
.
Have a look at Support for Process.destroyForcibly() and .isAlive() from Java 8 and Killing a process using Java and Code a Simple Java App to Kill Any Process After a Specified Time for more info.
Solution 2:
If you're trying to kill the main process your java code started, I'd suggest using System.exit()
. The benefits are explained here: when should we call system exit in java.
Essentially, System.exit()
will run shutdown hooks that will make sure any dependent non-daemon processes that may not have completed their work are killed before your process is killed. This is the clean way to do it.
If the process is not yours, you will have to rely on the Operating System to do this work for you as explained in this answer: Killing a Process Using Java
In that case your suggestion of Runtime.exec()
a kill on *nix would be a decent way to go.
Now as for destroyForcibly()
, you're typically going to call that on a child process spawned by your java code that was presumably started with the process api's ProcessBuilder.start()
or Runtime.exec()