Windows Apache Ant:终止由<;启动的进程;执行官>;当ant进程终止时

Windows Apache Ant:终止由<;启动的进程;执行官>;当ant进程终止时,windows,batch-file,ant,cmd,exec,Windows,Batch File,Ant,Cmd,Exec,我有一个ant任务,它使用执行一个冗长的构建操作。Ant由windows命令行中的批处理文件启动。如果通过关闭窗口来终止ant任务,则由启动的进程将继续运行。当ant进程本身被终止时,如何实现终止派生进程 Ant 1.10.0在带有Oracle JDK 8的Windows 7 x64上使用。启动流程的任务类似于: <exec executable="${make.executable}" dir="${compile.dir}" failonerror="true"> <

我有一个ant任务,它使用
执行一个冗长的构建操作。Ant由windows命令行中的批处理文件启动。如果通过关闭窗口来终止ant任务,则由
启动的进程将继续运行。当ant进程本身被终止时,如何实现终止派生进程

Ant 1.10.0在带有Oracle JDK 8的Windows 7 x64上使用。启动流程的任务类似于:

<exec executable="${make.executable}" dir="${compile.dir}" failonerror="true">
    <arg line="${make.parameters}" />
</exec>


关闭命令行窗口时,运行ant的
java
进程将正确终止。

以下是一个可能的解决方案:

  • 批处理脚本使用名为
    antPidFile
    的参数启动Ant
  • Ant脚本使用Java
    jps
    工具获取运行Ant脚本的
    Java.exe
    进程的PID
  • Ant脚本将PID写入
    antPidFile
  • Ant脚本生成子进程
  • Ant退出并控制返回到批处理脚本
  • 批处理脚本将前一个Ant脚本的PID加载到一个变量中
  • 批处理脚本使用内置的
    wmic
    工具来识别Ant生成的进程
  • 批处理脚本使用内置的
    taskkill
    工具终止Ant生成的所有子进程(和子进程)
编译文件

批处理脚本
setlocal
设置DeadAntProcessIdFile=ant-pid.txt
调用ant“-DantPidFile=%DeadAntProcessIdFile%”
rem Ant脚本应该已将其PID写入DeadAntProcessIdFile。
设置/p DeadAntProcessId=<%DeadAntProcessIdFile%
rem杀死由Ant脚本创建的任何延迟进程。
对于/f“跳过=1 usebackq”%%h in(
`wmic进程,其中“ParentProcessId=%DeadAntProcessId%”获取ProcessId^| findstr`
)执行任务终止/F/T/PID%%h

如果用户关闭命令行窗口,我认为批处理脚本的执行不会继续。不过方法很有趣,谢谢!我这里也有同样的问题。。。