猿问

CMD (Java) 中的 Postgres Restore 不再响应,而相同的命令在 CMD

我已经为 Windows 操作系统任务调度程序编写了一些代码,以自动获取备份并将其在本地恢复到我的 postgres 数据库。


所有的东西都在工作,直到最后一步,恢复命令。虽然直接在 cmd shell 中执行的同一命令运行良好。


我想我没有捕捉到恢复的结束,这是警告....


有人知道为什么没有执行和完成 cmd 脚本吗?我应该使用另一种方法,关闭连接吗?


这是我的代码


                    // 7 restore database


                    ProcessBuilder processBuilder21 = new ProcessBuilder();

                    // Windows

                    String cmd1 = "pg_restore -h localhost -p " + postgresPort + " -U " + postgresUsername + " -d "

                            + postgresDbname + " " + dbLocation;


                    processBuilder21.command("cmd.exe", "/c", cmd1);

                    System.out.println(cmd1);

                    try {

                        Process process = processBuilder21.start();

                        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

                        String line;

                        while ((line = reader.readLine()) != null) {

                            System.out.println(cmd1);

                        }


                        int exitCode = process.waitFor();

                        System.out.println("Exitcode: "+ exitCode);

                        if (exitCode == 0) {

                            System.out.println("Database restored: " + postgresDbname);

                        } else {

                            System.out.println("Error database restore");

                        }

                        System.out.println(cmd1);

                    } catch (IOException e) {

                        e.printStackTrace();

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }


慕婉清6462132
浏览 106回答 1
1回答

炎炎设计

您没有读取命令错误输出,因此如果生成大量错误输出,错误流缓冲区将满载并阻止命令。调用processBuilder21.redirectErrorStream(true)以将命令错误输出合并到标准输出中。其他变化:您可以组合语句。您需要关闭流,最好使用 try-with-resources。您可能希望将循环内的语句更改while为 print line,而不是cmd1。Process process = new ProcessBuilder("cmd.exe", "/c", cmd1)        .redirectErrorStream(true)        .start();try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {    for (String line; (line = reader.readLine()) != null; ) {        System.out.println(line);    }}int exitCode = process.waitFor();当然,由于您只是打印输出,您也可以通过调用inheritIO().int exitCode = new ProcessBuilder("cmd.exe", "/c", cmd1)        .inheritIO()        .start()        .waitFor();
随时随地看视频慕课网APP

相关分类

Java
我要回答