Java Runtime.getRuntime().exec()执行bat脚本遇到的坑及解决

作者:技术拾光时间:2026-07-23 08:06:04浏览:266

使用Runtime.getRuntime().exec()启动bat脚本后,需获取其进程ID,再通过taskkill命令终止。执行杀进程命令前需设置1秒睡眠,确保操作系统完成进程清理,否则可能因进程提前结束而失败。

Java 启动 bat 脚本使用 Runtime.getRuntime().exec()

近期在微服务开发项目中,需要从主函数启动时调用接口来启动另一个服务。当时采用 bat 脚本启动,具体代码如下:

Java Runtime.getRuntime().exec()执行bat脚本遇到的坑及解决

从日志中可以看到启动时打印出的信息。

使用

Runtime.getRuntime().exec(f + "dataimport_start.bat");

启动 bat 脚本的具体实现:

 Process exec = Runtime.getRuntime().exec(f + "\dataimport_start.bat");
            InputStream in = exec.getInputStream();
            String line;
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            while ((line = br.readLine()) != null) {
                System.out.println(line);
                }

启动完成后,前端需要关闭这个 bat 脚本,继续使用 Runtime 来实现。

解决代码

直接上代码:

    public String stopTrain(String pid) throws Exception{
        Process process;
        process = Runtime.getRuntime().exec("taskkill /pid " + pid + " -t -f");
        Thread.sleep(1000);
        process.getOutputStream().close();
        process.destroy();
        return "关闭成功!";
    }

此处通过进程 ID 来结束进程。注意其中 1 秒的睡眠时间——当执行 process = Runtime.getRuntime().exec("taskkill /pid " + pid + " -t -f"); 命令时,操作系统需要时间来完成杀进程操作。如果不提供这 1 秒缓冲,所创建的进程还没来得及执行完命令,自身就会被杀死,导致关闭失败。

总结

以上是实际开发中踩过的坑,希望对遇到类似问题的朋友有所帮助。