我有下面的這個build.xml代碼,它使用exec在Windows和Mac上啓動一個java進程(取決於你運行這個build.xml的哪個os),我想通過java來殺死這些子進程(如果這樣做會很好不知何故,當我殺死他們執行這個build.xml的父進程時他們會被殺死)?如何殺死ant exec以獨立於平臺的方式啓動的java進程?
注意:antRunAsync.js用於運行exe文件,antRunAsync.sh用於運行jar文件。
在build.xml >>>
<target name="runscript.windows">
<echo>This is a Windows machine.</echo>
<exec executable="cscript.exe">
<arg value="//NoLogo" />
<arg value="antRunAsync.js" /> <!-- this script -->
<arg value="${projectName}.exe" />
<arg line="${savedTestName}"/>
</exec>
</target>
<target name="runscript.mac">
<echo>This is an Mac machine.</echo>
<exec dir="." executable="/bin/sh">
<arg value="./antRunAsync.sh" />
<arg value="${projectName}.jar" />
<arg line="${savedTestName}"/>
</exec>
</target>
antRunAsync.js >>>
var WshShell = WScript.CreateObject("WScript.Shell");
var exeStr = "%comspec% /c";
var arg = "";
var windowStyle = 0;
var WshProcessEnv = WshShell.Environment("PROCESS");
var windowTitle = WshProcessEnv("ANTRUN_TITLE");
var outputFile = WshProcessEnv("ANTRUN_OUTPUT");
var OS = WshProcessEnv("OS");
var isWindowsNT = (OS == "Windows_NT");
// Loop through arguments quoting ones with spaces
for (var i = 0; i < WScript.Arguments.count(); i++) {
arg = WScript.Arguments(i);
if (arg.indexOf(' ') > 0)
exeStr += " \"" + arg + "\"";
else
exeStr += " " + arg;
}
WScript.Echo(exeStr);
var stdin = WshShell.Exec(exeStr).StdOut;
var stdout = WScript.StdOut;
while (!stdin.AtEndOfStream) {
var str = stdin.ReadLine();
stdout.WriteLine("Line " + (stdin.Line - 1) + ": " + str);
}
antRunAsync.sh >>>
echo $1
echo $2
java -jar $1 $2 2>&1 | tee log.txt