【问题标题】:How to display "pgbench" information in command line and read it如何在命令行中显示“pgbench”信息并阅读
【发布时间】:2019-05-06 07:39:33
【问题描述】:

我需要在 java(Windows) 中编写一个应用程序,它将运行带有 -P 参数的 pgbench 命令并从控制台读取输出。

我写了 .bat 文件“windowsPostgr.bat”:

设置“PGUSER=postgres”设置“PGPASSWORD=postgres”pgbench -c 1 -f C:/work/EasySQL.sql -j 1 -t 1500 -P 1 -U postgres mydb

还有我的代码:

String cmd = "cmd /c C:\\windowsPostgr.bat";
Process process = Runtime.getRuntime().exec(cmd);

try {

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

    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }

    int exitCode = process.waitFor();
    System.out.println("\nExited with error code : " + exitCode);

} catch (IOException e) {
    e.printStackTrace();
} catch (InterruptedException e) {
    e.printStackTrace();
}

结果,在cmd中运行jar时,只显示生成的pgbenh信息:

事务类型:自定义查询缩放因子:1 查询模式:简单 客户端数:1 线程数:每 1 个事务数 客户端:1500 实际处理的事务数:1500/1500 平均延迟:11.181 毫秒延迟标准开发:1.200 毫秒 tps = 89.073332 (包括建立连接)tps = 89.404427(不包括 建立连接)

然而,当 windowsPostgr.bat 由句柄启动时,会显示以下形式的附加信息(由于 -P 参数):

进度:1.0 秒,76.8 tps,纬度 12.147 毫秒 stddev 1.356

进度:2.0 s,84.1 tps,lat 11.864 ms stddev 1.034 等

其实问题是:从IDEA或jar运行windowsPostgr.bat时如何显示附加信息? reader.readLine() 会读取并显示这些信息吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    您没有从 java 中读取的附加信息实际上打印到 stderr,而不是 stdout,这就是您不读取它的原因。

    如果您想要此信息,您必须使用getErrorStream() 捕获进程的标准错误。

    编辑:阅读:Java Process with Input/Output Stream

    使用ProcessBuilder 而不是Runtime.getRuntime().exec(cmd) 来启动您的进程,然后使用builder.redirectErrorStream(true); 将错误流重定向到输出流更加容易。这样您就可以按正确的顺序获得所有内容。

    【讨论】:

    • 谢谢!我添加了 getErrorStream() 并得到了缺失的信息。但必须以与命令行相同的顺序显示信息。现在信息首先显示在流上 getInputStream(),然后是 getErrorStream()
    • 我已经用一个链接更新了我的答案,该链接显示了如何以正确的顺序获取所有内容。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2021-03-20
    • 2020-03-22
    相关资源
    最近更新 更多