【问题标题】:How can I terminate a process started from an Ant task if the script is cancelled?如果脚本被取消,如何终止从 Ant 任务启动的进程?
【发布时间】:2009-04-17 17:33:06
【问题描述】:

我创建了一个 Ant 任务来编译 VB6 应用程序。

在对源文件进行一些预处理后,我使用适当的参数启动VB6.exe

Process p = Runtime.getRuntime().exec(...);
p.waitFor();

但是当我在 Ant 运行时按 Ctrl+C 时,脚本和我的任务会终止,但生成的进程仍在运行。

如何在 Ant 脚本终止时自动终止我启动的进程? 如果我按 Ctrl+C 会发生什么?我的任务是立即终止还是有什么反应?

【问题讨论】:

    标签: ant process copy-paste


    【解决方案1】:

    您可能对此代码感兴趣:

        final Process process = new ProcessBuilder("blah blah").start();
        Runtime.getRuntime().addShutdownHook(new Thread() {
    
            @Override
            public void run() {
                process.destroy();
            }
    
        });
        process.waitFor();
    

    addShutdownHook的javadoc:

    Java 虚拟机响应两种事件而关闭:

    • 程序正常退出,当最后一个非守护线程退出或退出时 (等效地,System.exit)方法被调用,或者
    • 虚拟机响应用户中断而终止,例如键入 ^C,
      或系统范围的事件,例如用户注销或系统关闭。

    【讨论】:

      【解决方案2】:

      Runtime.exec() 在单独的操作系统进程中运行命令。当你按下 Ctrl+C 时,你会杀死 Java 进程。

      你可以试试Runtime.addShutdownHook(Thread hook)。当您按下 Ctrl+C 时 JVM 正在关闭时,将调用此钩子线程。实现钩子线程,它将尝试终止您启动的进程。要终止该进程,您需要找出该操作系统上的命令并在Runtime.exec() 中使用它。

      【讨论】:

      • 将 Runtime.exec() 与 kill 或其他特定于操作系统的命令一起使用是丑陋的; Process#destroy() 更好
      猜你喜欢
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 2014-06-15
      • 2011-12-10
      相关资源
      最近更新 更多