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がデーモン化されたスクリプトを殺しているいくつかの方法はありますか?
私はあなたが以下の簡素化をしようと提案し
スクリプトを引数として実行しましたか? – jrtapsell
あなたはJava ProcessBuilderの作品を参照していますか?もしそうなら、restart.shスクリプトにはシバン行が含まれています(私はちょうどこれを含めて質問を編集しました)。これは、スクリプトが第1引数としてスクリプトを持つシボンのインタプリタを使用して呼び出されることを意味するはずです。 – Andrew
Javaがシバンを尊重しているかどうか分からないので、明示的にシェルを設定すると問題が解決する可能性があります – jrtapsell