用Java杀死进程的正确方法

Kar*_*oss 15 java kill process runtime.exec destroy

在Java中杀死进程的最佳方法是什么?

获取PID然后用它杀死它Runtime.exec()

destroyForcibly()吗?

这两种方法有什么区别,还有其他解决方案吗?

Der*_*lin 19

如果您要杀死的进程已由您的应用程序启动

然后你可能有一个引用它(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()如果进程仍然存在则杀死它

如果要杀死的进程是外部的

那你没有太多选择:你需要通过OS API(Runtime.exec).在Windows上,要调用的程序将是taskkill.exe,而在Mac和Linux上,您可以尝试kill.


看看https://github.com/zeroturnaround/zt-exec/issues/19使用Javahttp://invisiblecomputer.wonderhowto.com/how-to/code-simple-java-app- 杀死一个进程kill-any-process-after-specified-time-0133513 /获取更多信息.


nll*_*oyd 7

如果你试图杀死你的java代码开始的主进程,我建议使用System.exit().这里解释了这些好处:我们何时应该在java中调用system exit.

本质上,System.exit()将运行关闭挂钩,以确保在您的进程被终止之前,任何可能尚未完成其工作的从属非守护进程被杀死.这是干净的方法.

如果该过程不属于您,则必须依赖操作系统为您完成此工作,如本答案中所述:使用Java杀死进程

在这种情况下,你Runtime.exec()对*nix杀人的建议将是一个不错的方式.

现在destroyForcibly(),您通常会在由您的java代码生成的子进程上调用它,该代码可能是以进程api ProcessBuilder.start()或者Runtime.exec()