2012-06-11 82 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中的問題()!)

參考: