我有以下 build.xml 代码,它使用 exec 在 Windows 和 mac 上启动一个 java 进程(取决于您运行此 build.xml 的操作系统),我想通过 java 杀死这些子进程(如果当我杀死执行此 build.xml 的父进程时它们被杀死,那就太好了)?
注意: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
最佳答案
JMX 是一种选项,您可以使用它以独立于平台的方式终止 java 进程。请查看下面的链接。
Is it possible to programmatically close a Java process through JMX
如果您正在寻找一个选项,杀死 ant 进程会导致 java 进程终止,我不确定。
关于java - 如何以与平台无关的方式终止由ant exec启动的java进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37707968/