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

标签 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:我已授予脚本执行权限

最佳答案

问题中的代码示例缺乏围绕 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/

相关文章:

java.lang.IllegalStateException : Neither BindingResult nor plain target object for bean name 'display' available as request attribute

java - 有没有更简单的方法来解析 Java 中的 XML?

linux - Lubuntu : Using . sh 脚本作为键绑定(bind),代码有效,执行脚本时出错

bash - Bash 条件句中感叹号是在括号内还是在括号外有关系吗?

java - 小服务程序测试

java - maven针对不同的目标设置了哪些classpath?能提供一下官方文档的链接吗?

java - Intellij 无法读取任何 Maven 相关的导入或类

node.js - 在 npm 脚本中使用 rm -rfolder_name/* 删除文件夹的内容会出现 'no such folder or directory' 错误

php - 如果用户在 AJAX 请求结束之前退出浏览器或更改页面会发生什么

shell - 修改 *plist 文件中的子键