🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

2150閲覧

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

k.k.k.k

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/12/14 07:09

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

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

shell

1// 起動 2brew services start tomcat@8 3 // 停止 4brew services stop tomcat@8

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

java

1 public static void doRestartTomcat() { 2 Process process = null; 3 InputStream inputStream = null; 4 BufferedReader inputBufferedReader = null; 5 String text = ""; 6 try { 7 log.info("[TomcatUtils::doRestartTomcat()]: START"); 8 // tomcatの再起動 9 String[] args = new String[] {"brew", "services", "start tomcat@8"}; 10 ProcessBuilder processBuilder = new ProcessBuilder(args); 11 processBuilder.redirectErrorStream(true); 12 process = processBuilder.start(); 13 inputStream = process.getInputStream(); 14 inputBufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 15 16 StringBuilder builder = new StringBuilder(); 17 String readLine = null; 18 while (inputBufferedReader.readLine() != null) { 19 readLine = inputBufferedReader.readLine(); 20 builder.append(readLine); 21 } 22 // 実行結果 23 text = builder.toString(); 24 log.info("[TomcatUtils::doRestartTomcat()]:" + text); 25 26 // 終了 27 process.waitFor(); 28 // 処理ステータス取得 29 int ret = process.exitValue(); 30 if (ret == 0) { 31 log.info("[TomcatUtils::doRestartTomcat()]: END"); 32 // 正常終了 33 } else { 34 // 異常終了 35 log.error("[TomcatUtils::doRestartTomcat()]: error result : " + text); 36 } 37 } catch (InterruptedException | IOException e) { 38 e.printStackTrace(); 39 } finally { 40 // 各種クローズ 41 if (process != null) { 42 process.destroy(); 43 } 44 if (inputStream != null) { 45 try { 46 inputStream.close(); 47 } catch (IOException e) { 48 log.error(e.toString()); 49 } 50 } 51 if (inputBufferedReader != null) { 52 try { 53 inputBufferedReader.close(); 54 } catch (IOException e) { 55 log.error(e.toString()); 56 } 57 } 58 } 59 }

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

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

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

shell

1// 起動 2sudo systemctl start tomcat.service 3// 停止 4sudo systemctl stop tomcat.service

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/12/14 18:28

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

2020/12/15 00: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にて展開するということを実施しております。 以上、宜しくお願い致します。
guest

回答1

0

自己解決

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

  • brew

Java

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

Java

1// tomcatの再起動 2String[] args = new String[] {"/bin/bash", "-c", "/usr/bin/systemctl restart tomcat.service"};

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

投稿2020/12/15 09:53

k.k.k.k

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問