使用Java在Windows上“杀死进程树”

我有一个Java webstart进程,它是Windows批处理脚本的一部分。 在这种情况下,我在批处理脚本中使用javaws命令。 使用“apache commons exec”以编程方式调用此匹配脚本(start.bat)。 在某些情况下,javaws调用的java进程会挂起,我必须从批处理脚本start.bat开始终止整个进程线程。 是否有通过apache commons exec杀死整个进程树的编程方式?

我尝试过使用“execWatchdog.destroyProcess();” 在“start.bat”脚本上。 但是它只会杀死start.bat进程而不是整个进程树。

有没有办法通过apache-commons-exec或类似的代码杀死整个进程树?

我已经看到这个问题在c ++中执行相当于“杀死进程树”的Windows ,它在c ++中执行相同的任务。 我想知道是否有人通过JNI实现了调用Windows本机系统调用。

终于有一些可行的东西,即使它是一个迂回的方式。

Apache Commons Exec API包含返回java.lang.Process对象的CommandLauncher类。 感谢这个链接

这里是从java.lang.Process获取windows Process Id的链接 。 这使用JNA库。

最后使用Process Id,这里是杀死进程树的命令字符串// String killCmd =“taskkill / F / T / PID”+ JNAHandler.getPid(process);

不幸的是,正如您所发现的那样,没有纯Java方法可以做到这一点。 您将不得不求助于本机命令或JNI库,所有这些都是依赖于平台的,并且比纯Java解决方案更复杂。

可能值得推荐Java bug数据库中的相关错误: http ://bugs.sun.com/view_bug.do?video_id = 4770092

幸运的是,我们可以说服Java开发人员,对于Java 8来说,糟糕的子进程处理是值得的。

据我所知,在commons-exec中没有这样的选择。 甚至不可能获得刚开始的任何过程的PID。 您可以在bash脚本中trap kill信号,并在脚本进程被终止时让处理程序终止子进程。