3

同じディレクトリで perl スクリプトを呼び出す tcsh スクリプトを呼び出す Java アプリケーションがあります。「runPerlScript.sh」と入力してコマンドからこのスクリプトを実行すると、完全に正常に動作し、必要に応じていくつかの出力ファイルが生成されます。ただし、次のコードを使用して Java からスクリプトを呼び出す場合:

    String[] runCmd  = {"/bin/tcsh","-c","/filepath/runPerlScript.sh"};
    Process run = Runtime.getRuntime().exec(runCmd);

    BufferedReader reader = new BufferedReader(new InputStreamReader(run.getInputStream()));

    String line = "";
    line = reader.readLine();
    System.out.println("\nStarting while.");
    while((line)!=null){
        System.out.println("Output from script: "+line);
        line=reader.readLine();
    }
    reader.close();
    System.out.println("Finished running perl script.");

シェルスクリプトからコンソールにエコーステートメントを出力します (私は NetBeans を使用しています) が、生成される出力ファイルは 4 つだけです (通常は 50 近く生成される場合)。これらの 4 つのファイルが生成された後、「runPerlScript.sh の実行が終了しました」というシェル スクリプトの echo ステートメントがコンソールに出力されるため、プロセスが早期に終了しているように見えます。ProcessBuilder など、このスクリプトを実行する方法をいくつか試しましたが、出力ファイルを生成する方法はないようです。上記のコードは、ProcessBuilder でハングアップが発生したため、実際に任意の出力を生成できる唯一の方法でした。スクリプトを継続的に実行する方法を知っている人はいますか?

4

1 に答える 1

1

Runtime.exec() javadoc から:

「指定された文字列コマンドを別のプロセスで実行します。」

プロセスが終了するのを待ちたいと仮定すると、メイン Java スレッドでプロセスが終了するのを待つ必要があります。これを行う最善の方法は、ProcessBuilder.start() によって返される Process を監視し、Process.waitFor() で待機することです。

于 2013-07-16T13:58:16.157 に答える