我正在尝试从 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:我已授予脚本执行权限
最佳答案
问题中的代码示例缺乏围绕 ProcessBuilder
的使用的错误处理,因此很可能发生了某种错误,但您无法看到它。
返回码Process#waitFor
正在被忽视。返回的值是生成进程的退出代码。我建议检查该值是否非零。
也没有处理 stdout 或 stderr,因此您不知道生成的进程是否正在写入任何输出来解释发生的情况。您可以使用 Process#getInputStream
访问 stdout 和 stderr和 Process#getErrorStream
分别。
另请注意,如果您的进程无法完全使用流或至少重定向它们,则进程可能会挂起。我注意到这个问题在 Windows 上尤其常见。标准技术是生成后台线程来使用流。上一个问题讨论了该技术和其他技术。
Java ProcessBuilder: Resultant Process Hangs
在 Java 代码中的错误处理得到这样的增强之后,我希望您将有更好的机会诊断脚本出了什么问题。
关于java - 从 Java 运行 shell 脚本(包含 wget),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34422365/