The right way to kill a process in Java

心已入冬 提交于 2019-12-21 03:31:12

问题


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 ?


回答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 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.




回答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()




回答3:


the one that worked for me is System.exit(0); it's work's well because it closes all still running processes and components




回答4:


In java 8 source code

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

I just want to say that the destroyForcibly is equal to the destroy in Java 8.
So you should try to kill the process by pid if process is still alive after you called the destroy method. You can easily get the pid if you are on java 9+,just call Process.pid() method.



来源:https://stackoverflow.com/questions/35230507/the-right-way-to-kill-a-process-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!