2011-09-13 15 views
2

からバックグラウンドで起動したシェルスクリプトを:Javaプログラム

ProcessBuilder processBuilder = new ProcessBuilder(); 
processBuilder.directory("/directory/where/the/script/is/located/"); 
String[] command = new String[]{"sh", "myScript.sh"}; 
processBuilder.command(command); 
Map<String, String> env = processBuilder.environment(); 
//tweak the environment with needed additions 
env.put(...); 
Process p = processBuilder.start(); 

stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 
stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 

// read the output from the command 
String line; 
while ((line = stdInput.readLine()) != null) 
{ 
    logger.fine(line); 
} 
p.waitFor(); 
int returnCode = p.exitValue(); 
// Return something according to the return code 
return ...; 

私は今、それが終了するのを待つスクリプトを起動していないしたい場合(としたがって、リターンコードに従って復帰する能力を失う)、環境をあらかじめ微調整することができますか?どのように進むべきですか?

ありがとうございました

+0

待機していないが、あなたが右、プロセスからの出力を取得する機能を失うことを意味しますか? – Nivas

+0

@Nivas別のスレッドで起動されていない場合は、プロセスのstdoutとstderrの両方を取得できます(また、取得する必要があります) –

答えて

5

新しいスレッドですべてを実行してください。

のRunnableに上記のコード全体をラップし、それのためのスレッドを開始します。あなたのメインコードは何か他のことを続けることができます。 実行可能ファイルでは、子プロセスの結果を取得すると、関心のある関係者に通知するために通知(またはオブザーバーパターン)を使用します。それも終了するため