質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.77%

【Java】ProcessBuilderを使ってtomcatの再起動を実施

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 286

score 5

やりたいこととしては、javaのコードより、同サーバーに配置されたtomcatを再起動させるということがしたいです。
そのため、一通り調べた結果、ProcessBuilderを使ってtomcatの再起動を試みております。

tomcatはMacOSでbrewによりインストールしたtomcat8となります。
以下のようなコマンドをMacOSのターミナルで実施することで起動・停止ができることは確認済です。

// 起動
brew services start tomcat@8
 // 停止
brew services stop tomcat@8

様々なサイトを参考にした結果、以下のようなtomcatを再起動するクラスを
javaのSpring Bootで作成済です。

    public static void doRestartTomcat() {
        Process process = null;
        InputStream inputStream = null;
        BufferedReader inputBufferedReader = null;
        String text = "";
        try {
            log.info("[TomcatUtils::doRestartTomcat()]: START");
            // tomcatの再起動
            String[] args = new String[] {"brew", "services", "start tomcat@8"};
            ProcessBuilder processBuilder = new ProcessBuilder(args);
            processBuilder.redirectErrorStream(true);
            process = processBuilder.start();
            inputStream = process.getInputStream();
            inputBufferedReader = new BufferedReader(new InputStreamReader(inputStream));

            StringBuilder builder = new StringBuilder();
            String readLine = null;
            while (inputBufferedReader.readLine() != null) {
                readLine = inputBufferedReader.readLine();
                builder.append(readLine);
            }
            // 実行結果
            text = builder.toString();
            log.info("[TomcatUtils::doRestartTomcat()]:" + text);

            // 終了
            process.waitFor();
            // 処理ステータス取得
            int ret = process.exitValue();
            if (ret == 0) {
                log.info("[TomcatUtils::doRestartTomcat()]: END");
                // 正常終了
            } else {
                // 異常終了
                log.error("[TomcatUtils::doRestartTomcat()]: error result : " + text);
            }
        } catch (InterruptedException | IOException e) {
            e.printStackTrace();
        } finally {
            // 各種クローズ
            if (process != null) {
                process.destroy();
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    log.error(e.toString());
                }
            }
            if (inputBufferedReader != null) {
                try {
                    inputBufferedReader.close();
                } catch (IOException e) {
                    log.error(e.toString());
                }
            }
        }
    }

以上のようなソースでして、ProcessBuilderに渡すところに問題があると思うのですが、
問題点をご教授いただけないでしょうか。

何卒、宜しくお願い致します。

別件で、同じようなことをEC2サーバーで実施したく、systemctlで以下のようにコントロールしてるコマンドも
同じ様にProcessBuilderを使って制御さえたいです。

// 起動
sudo systemctl start tomcat.service
// 停止
sudo systemctl stop tomcat.service

以上、宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dodox86

    2020/12/15 03:28

    実際に何が(どんなエラー、不具合)起きて困っているのでしょうか。質問文を読んでも分かりません。
    ※Spring Bootは恐らくTomcatで動かしているのでしょうから、そのTomcatをSpring Bootのコードの中から再起動(停止~起動)してしまったら、要望どおり動かなくても仕方なさそうですけど。

    キャンセル

  • k.k.k.k

    2020/12/15 09:56

    申し訳ございません。言葉足らずでした。
    実際のエラーとしては、
    if (ret == 0) {
    log.info("[TomcatUtils::doRestartTomcat()]: END");
    // 正常終了
    } else {
    // 異常終了
    log.error("[TomcatUtils::doRestartTomcat()]: error result : " + text);
    }
    の際に異常終了になることと、コマンドが実行されずこのソースだとtomcatが停止 → 起動にならないということが起こっております。
    期待する結果としては停止 → 起動をSpringBootより実施したいです。

    > ※Spring Bootは恐らくTomcatで動かしているのでしょうから、そのTomcatをSpring Bootのコードの中から再起動(停止~起動)してしまったら、要望どおり動かなくても仕方なさそうですけど。

    こちら書き漏れてしまったんですが、SpringBootでbootWarを実施し、warファイルを作成し、それをtomcatにて展開するということを実施しております。

    以上、宜しくお願い致します。

    キャンセル

回答 1

check解決した方法

0

こちら自己解決致しました。
ProcessBuilderに渡す際に絶対パスでコマンドを実施する必要がありました。
ですので、brewでのtomcatの制御、systemctlでのtomcatの制御はそれぞれ以下のようにしました。

  • brew
// tomcatの再起動
String[] args = new String[] {"/bin/bash", "-c", "/usr/local/Homebrew/bin/brew services restart tomcat@8"};
  • systemctl
// tomcatの再起動
String[] args = new String[] {"/bin/bash", "-c", "/usr/bin/systemctl restart tomcat.service"};

以上、ご質問覗いてくださった方ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る