2016-06-08 17 views
1

我有下面的這個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 

回答

0

ProcessHandle(java9)或jnr-posix提供一般過程管理選項。較早的java版本只能殺死通過ProcessBuilderRuntime.exec方法創建的直接子項。