【问题标题】:Running a bash shell script in java在 java 中运行 bash shell 脚本
【发布时间】:2012-11-22 08:25:55
【问题描述】:

我想从下面的程序中运行一个 shell 脚本,但它似乎没有做任何事情。我直接在 linux 终端中运行了相同的命令,它工作正常,所以我猜这是我的 java 代码。如您所见,我首先使用 PrintWriter 将命令写入 shell 脚本,但我希望这不会影响 shell 脚本本身的运行。任何帮助将不胜感激!

    public static void main(String[] args) {
    // TODO Auto-generated method stub

    String nfdump = "nfdump -o csv -r /home/shane/Documents/nfdump/nfcapd.201211211526>blank.txt";

    try {
        FileWriter fw = new FileWriter("/home/shane/Documents/script.sh");

        PrintWriter pw = new PrintWriter(fw);

        pw.println("#!/bin/bash");
        pw.println(nfdump);

        pw.close();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    Process proc = null;

    try {
        proc = Runtime.getRuntime().exec("sh /home/shane/Documents/script.sh");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

【问题讨论】:

  • 看看 ProcessBuilder 而不是 Runtime.getRuntime()... 当我使用它时,我似乎遇到的问题更少,事情看起来更难以理解
  • 好奇你为什么不直接执行nfdump
  • 我希望能够从我的 GUI 中使用 nfdump,它是我正在构建的软件的一部分
  • 你能检查script.sh是否为空吗?
  • 不不为空! ProcessBuilder 似乎工作正常!

标签: java shell


【解决方案1】:

您应该使用返回的Process 来获取结果。

Runtime#exec 将命令作为一个单独的进程执行并返回一个Process 类型的对象。您应该调用Process#waitFor,以便您的程序等待新进程完成。然后,您可以在返回的Process 对象上调用Process.html#getOutputStream() 来检查执行命令的输出。

另一种创建进程的方法是使用ProcessBuilder

Process p = new ProcessBuilder("myCommand", "myArg").start();

使用ProcessBuilder,您可以将命令的参数作为单独的参数列出。

请参阅 Difference between ProcessBuilder and Runtime.exec()ProcessBuilder vs Runtime.exec() 以了解有关 Runtime#execProcessBuilder#start 之间差异的更多信息。

【讨论】:

  • 实际上,如果您要检索子进程的输出,那么您需要调用Process#getInputStream(),它通过管道连接到进程的输出流。
【解决方案2】:

试试这个,它会起作用的。

String[] cmd = new String[]{"/bin/sh", "path/to/script.sh"};
Process pr = Runtime.getRuntime().exec(cmd);

【讨论】:

    【解决方案3】:

    当您从 Java 执行脚本时,它会生成一个新的 shell,其中没有 PATH 环境变量 放。

    使用以下代码设置 PATH 环境变量应该会运行您的脚本。

    String[] env = {"PATH=/bin:/usr/bin/"};
    String cmd = "you complete shell command";  //e.g test.sh -dparam1 -oout.txt
    Process process = Runtime.getRuntime().exec(cmd, env);
    

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 2017-09-24
      • 2018-04-17
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多