The right way to kill a process in Java

Kariamoss picture Kariamoss · Feb 5, 2016 · Viewed 30.4k times · Source

What's the best way to kill a process in Java ?

Get the PID and then killing it with Runtime.exec() ?

Use destroyForcibly() ?

What's the difference between these two methods, and is there any others solutions ?

Answer

Derlin picture Derlin · Feb 5, 2016

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 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092 for more info).

The destroyForcibly should only be used if destroy() failed after a certain timeout. In a nutshell

  1. terminate process with destroy()
  2. allow process to exit gracefully with reasonable timeout
  3. 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 https://github.com/zeroturnaround/zt-exec/issues/19 and Killing a process using Java and http://invisiblecomputer.wonderhowto.com/how-to/code-simple-java-app-kill-any-process-after-specified-time-0133513/ for more info.