16

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

3 回答 3

29

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

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

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

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

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

请参阅ProcessBuilder 和 Runtime.exec() 之间的区别以及ProcessBuilder 与 Runtime.exec()以了解有关 和 之间区别的更多Runtime#exec信息ProcessBuilder#start

于 2012-12-04T16:37:24.500 回答
8

当您从 Java 执行脚本时,它会生成一个未设置 PATH 环境变量的新 shell。

使用以下代码设置 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);
于 2013-02-18T09:15:11.447 回答
8

试试这个,它会工作的。

String[] cmd = new String[]{"/bin/sh", "path/to/script.sh"};
Process pr = Runtime.getRuntime().exec(cmd);
于 2013-02-08T05:08:25.753 回答