从Java运行shell脚本(包含wget)

时间:2015-12-22 18:36:48

标签: java shell

我尝试从Java执行shell脚本。该脚本应该使用wget从URL下载文件。这是我的代码。

     public class RunShellScriptFromJava {
         public static void main(String a[]) {
         try {
              ProcessBuilder pb = new ProcessBuilder("/bin/sh","script.sh");
              Process p = pb.start();
              p.waitFor();
              System.out.println("Success");
         } catch (Exception e) {
         e.printStackTrace();
      }
     }
    }

script.sh的内容

     echo "start"
     wget http://alex.smola.org/drafts/thebook.pdf
     echo "end"

我的问题: 这是正确的方法吗?如果没有,请指出我正确的方向。它不会抛出任何异常但我看到该文件没有被下载。任何领导/帮助表示赞赏。

感谢。

PS:我已经为脚本

授予了执行权限

3 个答案:

答案 0 :(得分:1)

问题中的代码示例缺少围绕ProcessBuilder使用的错误处理,因此可能会发生某种错误,但您无法了解它。

Process#waitFor的返回代码被忽略。返回的值是生成进程的退出代码。我建议检查一下这个值是否为非零值。

也没有stdout或stderr的处理,所以你不会知道生成的进程是否正在写任何解释发生了什么的输出。您可以分别使用Process#getInputStreamProcess#getErrorStream来访问stdout和stderr。

另请注意,如果流程无法完全使用流,或者至少重定向流,则流程可能会挂起。我注意到这个问题在Windows上特别常见。标准技术是生成后台线程以使用流。前一个问题讨论了该技术和其他技术。

Java ProcessBuilder: Resultant Process Hangs

在这样增强了Java代码中的错误处理后,我希望你有更好的机会来诊断脚本出了什么问题。

答案 1 :(得分:1)

执行此操作的正确方法是使用Java下载文件而不是shell脚本。 shell脚本的问题在于它们与系统有关。通过使用它们,您将失去java的一个主要好处,即系统独立性。 Java中有许多库可以实现该功能。以下内容适用于使用apache IO Commons的FileUtils类。

URL url = new URL("http://alex.smola.org/drafts/thebook.pdf");
File download = new File('.');
FileUtils.copyURLToFile(url, download);

答案 2 :(得分:0)

此脚本和java示例有效,可能指定wget的完整路径,以确保您知道pdf的保存位置。

$ javac RunShellScriptFromJava.java
$ java RunShellScriptFromJava
Success
$ ls
RunShellScriptFromJava.java  thebook.pdf RunShellScriptFromJava.class  script.sh

示例/更新的脚本:

wget -O /home/MYSER/test.pdf http://alex.smola.org/drafts/thebook.pdf