2017-09-06 18 views
4

My Javaサーバーアプリケーションがサーバーの再起動を要求したときに実行されるbashスクリプトを作成しています。このスクリプトは、Javaアプリケーションのプロセスツリーの外にある必要のある操作を行います。デーモンスクリプトを実行するJava Execute Bashスクリプト

私は、次の方法でProcessBuilderをを使用してJavaで再起動スクリプトを呼び出す:

// Vars declared at the top of the file 
private static final String LOC = "/some/directory/"; 
private static final String RESTART_SCRIPT = LOC + "restart.sh"; 
... 
// In the function that is invoked to handle reboot behavior 
final ProcessBuilder pb = new ProcessBuilder(RESTART_SCRIPT); 
Process p = pb.start(); 

このスクリプトは、再起動ロジックのすべてを扱う別のスクリプトをdeamonizeするには、以下のん。これは、次のようになります。

#!/bin/bash 
(bash /some/directory/shutdownHandler.sh "true" &) 
exit 0 

Javaアプリケーションでは、私がProcessBuilderをロジックを含む関数を呼び出し、私はshutdownHandler.shスクリプトのロジックの効果が表示されない場合は、。ファイルへのテキストの単純なエコーも発生しません。私はすでに正しいアクセス権があることを確認しました。

コマンドラインからrestart.shを直接実行すると、正常に動作します。

なぜこの動作の違いが見られるのかに関するアドバイスをお願いします。 Javaがデーモン化されたスクリプトを殺しているいくつかの方法はありますか?

私はあなたが以下の簡素化をしようと提案し
+0

スクリプトを引数として実行しましたか? – jrtapsell

+0

あなたはJava ProcessBuilderの作品を参照していますか?もしそうなら、restart.shスクリプトにはシバン行が含まれています(私はちょうどこれを含めて質問を編集しました)。これは、スクリプトが第1引数としてスクリプトを持つシボンのインタプリタを使用して呼び出されることを意味するはずです。 – Andrew

+0

Javaがシバンを尊重しているかどうか分からないので、明示的にシェルを設定すると問題が解決する可能性があります – jrtapsell

答えて

0

私が記述した使用シナリオでは、スクリプトshutdownHandler.shが正しく起動する方法が見つかりました。問題はどのように私がshutdownHandler.shをデーモン化していたかにありました。

  • ハンドルstdoutstderr、およびスクリプトのstdin:上記のいくつかの重要なことを行い

    #!/bin/bash 
    LOGFILE="/some/log/directory/scriptLog.log" 
    (setsid /some/directory/shutdownHandler.sh "true" >$LOGFILE 2>&1 < /dev/null &) 
    exit 0 
    

    :私はにrestart.shを変更しました。 stdoutstderrLOGFILEに向けられ、制御端末INITへ

  • Reparentsスクリプトからdev/nullstdinから
  • 切断を付加しています。 shutdownHandler.shはJVMと同じプロセスツリーにはありません
0

final String[] RESTART_COMMAND = { "nohup", "/some/directory/shutdownHandler.sh", "true" }; 
final ProcessBuilder pb = new ProcessBuilder(RESTART_COMMAND); 
Process p = pb.start(); 
//DON'T waitFor() 

nohupを使用してwaitForに避けることと同じ効果あなたのRESTART_SCRIPT道具を持っている必要があります。両方のプロセスのライフサイクルは独立している(jvmshutdownHandler.shを待ちません。 Javaプロセスが終了してもshutdownHandler.shが中断されることはありません)。

関連する問題