如何杀死Ant启动的失控Java进程?

时间:2012-06-11 09:38:38

标签: java ant kill

如果我从ant脚本启动一个分叉的java进程并终止ant进程,它就不会杀死java进程。无论是从IDE还是从命令行运行它都是这种情况。

<target name="myTarget" >
  <java classname="path.to.MyClass" 
        fork="yes" 
        failonerror="true" 
        maxmemory="128M">
    <classpath refid="run" />
  </java>
</target>

有没有办法链接这些,以便杀死ant进程会杀死java进程?

我见过以下Q&A - 但这似乎集中在如何手动终止java进程。我不想这样做,因为我有许多其他java应用程序在运行,并且在TaskManager中找到正确的java.exe进程并不总是直截了当。

3 个答案:

答案 0 :(得分:2)

不幸的是,这似乎是一个长期存在的已知问题。

当Ant任务终止时,不会触发分叉的Java进程关闭挂钩。 (这似乎是自Java 1.4(!)以来的一个问题)

供参考:

答案 1 :(得分:1)

如果将fork设置为“no”,将使用相同的VM,因此终止ant进程也会终止此特定的java进程。

答案 2 :(得分:0)

杀死进程的跨平台解决方案需要付出一些努力。请参阅Java tool/method to force-kill a child process

对于Windows XP及更高版本,以下批处理脚本可能会有所帮助:

for /f "skip=1 usebackq" %%h in (`wmic process where "Name like 'java%%.exe' and CommandLine like '%%path.to.MyClass%%'" get ProcessId ^| findstr .`) do taskkill /F /T /PID %%h

此脚本使用内置WMIC命令查找在命令行中某处具有path.to.MyClass的任何正在运行的java * .exe进程的进程ID。如果您需要WMIC更具体地匹配您的特定Java进程,请使用WMIC帮助模式列出的属性:

wmic process get /?
在给定根进程ID(/ PID)的情况下,

taskkill将终止进程树(/ T)。