1

このコードを使用して、スクリプトを実行しようとしています:

String command = "./myScript.sh";
pb = new ProcessBuilder(command, param1, param2);
pb.directory(directory);
pb.start();

エラーは発生しませんが、想定される結果も得られません。とにかく、ターミナルで同じコマンドを直接実行しようとしましたが、すべてが正しく機能していました。
私は何かが欠けていますか??

前もって感謝します

4

2 に答える 2

4

プロセス ( pb.start()) を開始すると、インスタンスが返されProcessます。スクリプトが入力を読み取ったり、標準出力または標準エラー出力に出力を書き込んだりする場合はProcess.getInputStream()...getOutputStream()とを使用して別のスレッドでこれを処理する必要がありgetErrorStream()ます。これを行わないと、プロセスがハングする可能性があります。また、プロセスの戻りステータスを取得するには、Process.waitFor()andを呼び出す必要があります。Process.exitValue()負の数の場合、システムはスクリプトを起動できませんでした。

編集:これは短い単純化された例です。これは単なるおもちゃであり、次の条件下でのみ確実に動作します。

  1. スクリプトは入力を必要としません

  2. このスクリプトは、stdout と stderr の両方で大量の出力を生成しません。その場合、プログラムは stderr の前にすべての stdout を読み取るため、stderr バッファーがいっぱいになり、プロセスの完了がブロックされる可能性があります。「実際の」実装では、stdout と stderr を別々のスレッドで読み取ります (ヒント、loadStream()実装するクラスでメソッドをラップしますRunnable)。

 

public class PBTest
{
    public static void main(String[] args) throws Exception
    {
        ProcessBuilder pb = new ProcessBuilder("sc","query","wuauserv");
        Process p = pb.start();
        String output = loadStream(p.getInputStream());
        String error  = loadStream(p.getErrorStream());
        int rc = p.waitFor();
        System.out.println("Process ended with rc=" + rc);
        System.out.println("\nStandard Output:\n");
        System.out.println(output);
        System.out.println("\nStandard Error:\n");
        System.out.println(error);
    }

    private static String loadStream(InputStream s) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(s));
        StringBuilder sb = new StringBuilder();
        String line;
        while((line=br.readLine()) != null)
            sb.append(line).append("\n");
        return sb.toString();
    }
}
于 2010-11-19T21:24:42.990 に答える
2

問題は、私がスクリプトを呼び出す途中ではありませんでした。それは正しかったです。
しかし、それはスクリプトの中にありました。最初は:

#!/bin/bash
inputFolder=$1
outputFolder=$2 

cd $inputFolder

for file in `ls ` ; do
ffmpeg -i $inputFolder/$file -ar 22050 $outputFolder/$file.mp4 
done

しかし、私は得ffmpeg command not foundたので、次のように変更しました:

#!/bin/bash
inputFolder=$1
outputFolder=$2 

cd $inputFolder

for file in `ls ` ; do
/usr/local/bin/ffmpeg -i $inputFolder/$file -ar 22050 $outputFolder/$file.mp4 
done  

穴のパスで。しかし、パスに ffmpeg があり、任意のディレクトリから直接コンソールで実行できる場合、なぜこれが必要なのか疑問があります。誰かが私に答えを与えることができれば、それは大歓迎です:)

于 2010-11-23T10:25:14.560 に答える