2012-06-11 47 views
3

如果我从一个ant脚本启动分叉的java进程并杀死ant进程,它不会终止java进程。无论是从IDE还是从命令行运行,都是如此。如何杀死由Ant启动的失控Java进程?

<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进程以杀死它并不总是直截了当的。

+0

哪个操作系统脚本上运行? –

+0

@ChadNouis,Windows(XP和7)。但是,如果可能的话,我更喜欢独立于平台的解决方案。 – amaidment

+0

您可以使用带有守护程序元素的并行元素吗?我对任何一种功能都不太了解,并且我知道你不是在寻找并行的,但是我碰到了[this thread](http://stackoverflow.com/questions/2299432/stopping-a-parallel-java -task-with-ant)以及你的线程寻找停止服务器java进程的解决方案。看起来守护进程会在蚂蚁完成时安全地杀死正确的java进程,而且我认为这意味着当蚂蚁很早就被杀死了。 – mjohnsonengr

回答

1

如果您将fork设置为“no”,将使用相同的虚拟机,因此杀死ant进程也会终止这个特定的java进程。

+0

使用'fork =“yes”'有几个原因;首先,我想设置VM参数 - 例如'maxmemory =“128M”',其次,当我用'fork =“no”'开始我的进程时会抛出很多异常 - 例如ehcache和数据库连接 - 这符合[docs](http://ant.apache.org/manual/Tasks/java.html)中的“当您运行此任务时发生的奇怪事情” – amaidment

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 

这个脚本使用具有path.to.MyClass内置WMIC命令找到任何运行Java的进程ID * .EXE程序在命令行的某处。如果您需要WMIC在符合特定的Java程序更具体,发挥与WMIC的帮助模式中列出的属性:给定根进程ID(/ PID

wmic process get /? 

taskkill会杀进程树(/ T) )。

2

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

当Ant任务终止时,分叉的Java进程关闭挂钩不会被触发。 (这似乎是因为Java 1.4中的问题()!)

参考: