在Java中运行Bash Shell脚本

19

我想从下面的程序中运行一个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();
    }

3
可以尝试使用ProcessBuilder而不是Runtime.getRuntime()... 当我使用它时,问题似乎更少,事情看起来更容易理解。 - RNJ
1
好奇为什么您没有直接执行 nfdump - Miserable Variable
我想要能够从我的GUI中使用nfdump,它是我正在构建的软件的一部分。 - Shane
你能检查一下 script.sh 是否为空吗? - Aaron Digulla
不,不是空的!但 ProcessBuilder 似乎工作良好! - Shane
感谢RNJ提供的ProcessBuilder提示。 - Shane
3个回答

30
你应该使用返回的 Process 来获取结果。 Runtime#exec 将命令作为一个单独的进程执行并返回一个类型为 Process 的对象。你应该调用 Process#waitFor,这样你的程序就会等待新进程完成。然后,你可以在返回的 Process 对象上调用 Process.html#getOutputStream() 来检查执行命令的输出。
创建进程的另一种方法是使用 ProcessBuilder
Process p = new ProcessBuilder("myCommand", "myArg").start();

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

查看 ProcessBuilder与Runtime.exec()之间的区别ProcessBuilder vs Runtime.exec() 了解更多关于 Runtime#execProcessBuilder#start 之间的区别。


2
实际上,如果你想要检索子进程的输出,则需要调用Process#getInputStream(),它会将数据流输送到进程的输出流。 - Geoffrey Tucker

9

当你从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);

8
尝试这个,它会起作用。
String[] cmd = new String[]{"/bin/sh", "path/to/script.sh"};
Process pr = Runtime.getRuntime().exec(cmd);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接