16

以下のプログラムからシェルスクリプトを実行したいのですが、何も実行されないようです。同じコマンドをLinuxターミナルで直接実行しましたが、正常に動作するので、Javaコードだと思います。ご覧のとおり、私は最初にPrintWriterを使用してシェルスクリプトにコマンドを書き込んでいましたが、これはシェルスクリプト自体の実行には影響しないと思います。どんな助けでもいただければ幸いです!

    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コマンドを別のプロセスとして実行し、タイプがのオブジェクトを返しますProcessProcess#waitFor新しいプロセスが終了するまでプログラムが待機するように呼び出す必要があります。Process.html#getOutputStream()次に、返されたオブジェクトを呼び出してProcess、実行されたコマンドの出力を検査できます。

プロセスを作成する別の方法は、を使用することProcessBuilderです。

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

を使用してProcessBuilder、コマンドの引数を個別の引数としてリストします。

との違いの詳細については、ProcessBuilderとRuntime.exec()の違いおよびProcessBuilderRuntime#execとRuntime.exec()の違いを参照してくださいProcessBuilder#start

于 2012-12-04T16:37:24.500 に答える
8

Javaからスクリプトを実行すると、PATH環境変数が設定されていない新しいシェルが生成されます。

以下のコードを使用してPATHenv変数を設定すると、スクリプトが実行されます。

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 に答える