我尝试从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:我已经为脚本
授予了执行权限答案 0 :(得分:1)
问题中的代码示例缺少围绕ProcessBuilder
使用的错误处理,因此可能会发生某种错误,但您无法了解它。
Process#waitFor
的返回代码被忽略。返回的值是生成进程的退出代码。我建议检查一下这个值是否为非零值。
也没有stdout或stderr的处理,所以你不会知道生成的进程是否正在写任何解释发生了什么的输出。您可以分别使用Process#getInputStream
和Process#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