【问题标题】:bash script not waiting for completion of commands when called from java从java调用时,bash脚本不等待命令完成
【发布时间】:2015-05-26 14:21:16
【问题描述】:

我正在运行以下 bash 脚本

scrapy crawl flipkart -a key="$1" -o "$2"flipkart.xml
scrapy crawl myntra -a key="$1" -o "$2"myntra.xml
scrapy crawl jabong -a key="$1" -o "$2"jabong.xml

echo " scrapy completed"

通过终端执行的 bash 脚本按预期运行,因为它完成了一次 scrapy 命令的执行,然后是另一个,但是当我尝试通过 java 调用它时,相同的脚本不会执行 scrapy 命令。 它执行 shell 脚本,因为我能够通过 java 中的输入流读取回显数据。

String command = "/Users/renny/Documents/WorkSpaces/Scrapy/tutorial/tutorial/crawls.sh";


String[] cmd = new String[]{"/bin/sh", command,key,formattedDate};
//Process p = Runtime.getRuntime().exec(cmd);

ProcessBuilder p = new ProcessBuilder(cmd);
Process p2 = p.start();

InputStream error = p2.getErrorStream();
       for (int i = 0; i < error.available(); i++) {
       System.out.println("" + error.read());
       }

BufferedReader br = new BufferedReader(new InputStreamReader(p2.getInputStream()));
String line;

System.out.println("Output of running " + command + " is: ");

请建议我如何确保scrapy命令被执行。

在一个批处理文件中,我认为我们可以调用 start 来确保命令在单独的提示符下运行,我可以在 bash 脚本中执行类似的操作

【问题讨论】:

  • 您确定您的PATH 是正确的,这样可以找到scrapy 吗?您从该命令尝试中得到什么标准错误?
  • 我会读取错误流并显示它。它可能包含未执行命令的原因。
  • 我在运行命令时没有收到任何错误。我能够从能够运行scrapy命令的终端成功运行脚本文件。
  • 我添加了以下代码来检查错误流 InputStream error = p2.getErrorStream(); for (int i = 0; i
  • 这种读取错误流的方式并不可靠,因为它只打印调用时可用的字节。您应该以与读取“输入”流相同的方式执行此操作 - 使用 BufferedReader

标签: java linux bash shell scrapy


【解决方案1】:
export PATH=usr/local/bin/scrapy:$PATH
export PATH=/usr/local/bin:$PATH 

将导出路径添加到脚本文件解决了这个问题,感谢@RealSkeptic。

【讨论】:

    【解决方案2】:

    通过使用start,您要求在后台启动批处理文件。

    致电Process#waitFor():

    如有必要,使当前线程等待,直到此Process 对象表示的进程终止。

    您还将获得子进程的退出值。如果成功编码0,或者non-zero如果错误退出代码`。

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多