1

システム コマンドを呼び出し、そのコマンドを実行してから制御を Java スレッドに返す Java アプリケーションを構築しています。私が行っているデバッグ手順は、test.pl という perl スクリプトを作成し、そのスクリプトを Java メソッドから呼び出すことです。Windows では、期待される出力と戻り値 0 が得られます。Linux では、出力もエラーも得られません。どこが間違っているのかを突き止めるためにオンラインでかなりの時間を費やしましたが、既に述べたように、Windows では実行されます。私がキャッチしていないのは単純なエラーに違いないと思います。

http://www.javaworld.com/jw-12-2000/jw-1229-traps.htmlの優れた Runtime.exec() チュートリアルから派生したコードを次に示します。

try {

    FileOutputStream fos = new FileOutputStream("output/" + this.startPosition + ".txt");
    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec(new String[]{"perl", "/data/stat-positive-selection/thaddeus/treesim/chr2YRI/test.pl"});

//System.out.println(commandLine);
// any error message?
StreamGobbler errorGobbler = new 
   StreamGobbler(proc.getErrorStream(), "ERROR");            

// any output?
StreamGobbler outputGobbler = new 
    StreamGobbler(proc.getInputStream(), "OUTPUT", fos);

// kick them off
errorGobbler.start();
outputGobbler.start();

// any error???
int exitVal = proc.waitFor();
System.out.println("ExitValue: " + exitVal);

fos.flush();
fos.close(); 
} catch (Throwable e){
    e.printStackTrace();
    }
}

私はそれを理解し、コードを修正しました

新しい exec 呼び出し、シェルの使用、および perl へのパスが必要です

Process proc = rt.exec(new String[]{"/bin/bash", "-c", "/usr/bin/perl /data/stat-positive-selection/thaddeus/treesim/chr2YRI/test.pl"});
4

2 に答える 2