java - 如何等待多线程 shell 脚本执行完成在我的 Web 服务中调用?

标签 java multithreading bash process

我有一个 java Restful 服务方法,它使用 processBuilder 执行 myscript.sh。我的脚本采用一个输入(示例 - myscript.sh/path/to-a/folder)。 脚本里面是这样的

-> execute a command which is multithreaded i.e parallel processing
-> echo "my message"

现在,当从 Linux 命令行调用我的脚本时,它执行得很好。首先,所有线程运行完成,然后终端上显示线程命令执行的一些文本输出,然后显示回显我的消息。

但是当我使用 processBuilder 从 java 调用相同的脚本时,最后一条回显消息立即出现并且执行结束。

按照我从 java 调用脚本的方式

ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash","/path/to/myscript.sh","/path/to/folder/data");
Process proc = processBuilder.start();
StringBuffer output = new StringBuffer();
        BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
        String line = "";
        while((line = reader.readLine()) != null){
            output.append(line + "\n");
        }

        System.out.println("### " + output);

我不知道发生了什么,也不知道如何调试。 有人可以告诉我如何在从终端或 java processBuilder 运行时从 shell 脚本获得相同的行为吗?

最佳答案

使用ProcessBuilder.redirectErrorStream(boolean redirectErrorStream)有参数true将错误合并到输出中。或者,您也可以使用 shell 命令语法 cmd 2>&1将错误与输出合并。

在这些情况下,您可能会立即获得最后一个 echo 的输出。语句(而不是脚本花费时间运行并返回正确的结果):

  • 缺少环境变量
  • 启动的 bash 需要获取 .bashrc 或一些此类资源文件
  • 启动的 bash 可能没有在正确的目录中运行(您可以在 ProcessBuilder 中设置)
  • 启动的 bash 可能无法在其 PATH 中找到某些脚本/可执行文件
  • 启动的 bash 可能无法在任何可执行文件的路径中找到正确的库

合并错误后,您就可以自己调试并查看错误。

关于java - 如何等待多线程 shell 脚本执行完成在我的 Web 服务中调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40627645/

相关文章:

java - 如何在 Swing 延迟几秒后处理帧?

java - @IntDef注解和别人代码的返回值不能被注解或者如何暂时禁止注解影响代码?

java - 多线程应用程序中编译时和运行时类路径不匹配的原因是什么?

macos - 无法通过 MacPorts 在 Mac 中更新我的 Bash

macos - mkdir -pv 不详细

java - JDBC 资源名称被附加到它的容器 ('_pm' 修改)

java - Java嵌套队列

pthreads 程序的竞争条件会使操作系统或 X 完全崩溃吗?

ios objective c todo 应用程序

bash - 在文件的行中搜索特定字段