2011-12-07 21 views
1

この問題を解決するために手伝ってください。差異 - javaを介して、つまり通常の実行を介してunixコマンドを実行する

ランタイムオブジェクトを使用してrsyncコマンドを実行するJavaコードがあります。

ソースマシンで以下のコードを実行しています。ターゲットマシンで同期中にrsync接続に問題がある場合、コードは終了値を受け取る必要がありますが、今は起こっていません。

私は、ソースマシンに直接(ないJavaコードを介して)rsyncコマンドを実行すると、私は同期中に殺す-9オプションを使用して、ターゲット・マシンでrsyncのプロセスを殺す場合:あなたの詳細を与えることを

String rsyncCommand = "rsync –abv <source> <remoteAddr:dest>" 
Runtime rt = Runtime.getRuntime(); 
rt.exec(rsyncCommand); 

ソースのrsyncプロセスは終了メッセージとともに終了します。

私はJavaコードを通してrsyncを実行し、ターゲットでの同期中にプロセスを終了しても、終了メッセージは受信されません。 javaとrsyncプロセスはまだ実行モードです。しかし、何の仕事もしていない。

javaを介してコマンドを実行した場合とコマンドプロンプトを使用して直接実行する場合の違いは何ですか?

いずれもrsyncに似た種類の問題がありますが、rsyncをJavaから実行するための他のオプションもありますが、 "ProcessBuilder"でも試してみました。

この問題を解決するためのいくつかの点を教えてください。


回答ありがとうございました。サンプルコードのみを提供しました。以下は、私のJavaで使用している完全なコードです。

Runtime rt = Runtime.getRuntime(); 
rt.exec(new String[]{"rsync", "-abv", "<source>", "<remoteAddr:dest>"}); 

のexecコマンドラインのいずれかの解析を行いません、:

Runtime rt = Runtime.getRuntime(); 
    Process proc = null; 
    try { 
    proc = rt.exec(rsyncCommand); 
    InputStream stderr = proc.getErrorStream(); 
    InputStreamReader isrErr = new InputStreamReader(stderr); 
    BufferedReader brErr = new BufferedReader(isrErr); 

InputStream stdout = proc.getInputStream(); 
InputStreamReader isrStd = new InputStreamReader(stdout); 
BufferedReader brStd = new BufferedReader(isrStd); 

String val = null; 
while ((val = brStd.readLine()) != null) { 
    System.out.println(val); 
} 

while ((val = brErr.readLine()) != null) { 
    System.out.println(val); 
} 
int exitVal = proc.waitFor(); 
} catch (Exception e) { 
e.printStackTrace(); 

}

答えて

1

幹部のあなたの呼び出しは()間違っている、それが何かのように、直接パラメータを指定する必要があります"rsync -abv"というコマンドを1つの文字列としてexecしようとしています

+0

終了値を返すまで、スレッドは待機します任意の ';'のようにすることができます:dest = "8080; rm -rf/" – Woot4Moo

2

これを実行しても処理が完了していない場合、終了値

Process process = rt.exec(rsyncCommand); 
int exitValue = process.exitValue(); 

代わりにあなたが

int exitValue = process.waitFor() 

を使用する必要がありますプロセスは、ソースとRemoteAddrはとdestが、彼は破棄することもできます関数への入力パラメータであると仮定

+1

良い点。答えを更新しました。また、' waitFor() 'によってスローされる' InterruptedException'の処理を追加しました。 – Asaph

関連する問題