2016-12-22 8 views
2

私の関数/プロセスが終了したときに終了しないバックグラウンドでシェルスクリプトを実行しようとしています。しかし、それはnohupにもかかわらず、Javaスレッドが終了すると思われる。スクリプトもそうです。Java:バックグラウンドでのシェルスクリプトの実行

以下はサンプルコードです。

/// 
/// Tries to run a script in the background 
/// 
try { 
    Runtime rt = Runtime.getRuntime(); 
    Process pr = rt.exec("nohup sh ./runner.sh > output.txt &", new String[] {}, wrkDir); 
    // pr.waitFor(); // Intentionally not using 
} catch(Exception e) { 
    throw new RuntimeException(e); 
} 

答えて

1

nohupは、呼び出し元のプログラムからではなく、シェルからの呼び出しに適用されます。

これを解決する方法はたくさんありますが、nohup runner.sh...コードを呼び出すランチャーシェルスクリプト(shを起動する必要なし)を呼び出すようにJavaコードを変更することをお勧めします。

このような何か(未テスト)コード:Javaの改訂

/// 
/// Tries to run a script in the background 
/// 
try { 
    Runtime rt = Runtime.getRuntime(); 
    Process pr = rt.exec("sh ./launcher.sh", new String[] {}, wrkDir); 
    // pr.waitFor(); // Intentionally not using 
} catch(Exception e) { 
    throw new RuntimeException(e); 
} 

launcher.sh

#!/bin/sh 

nohup ./runner.sh > output.txt & 

私は、ここにリダイレクトについてはよく分かりませんしかし、これがうまくいくなら(私が言及したように、この解決法はテストされていません)、欠点はあなたが餌を失うことですrunnerを呼び出そうとしていません。そのスクリプト呼び出しのエラーは、Javaプロセスでは使用できなくなります。

関連する問題