かつ丼はおやつに入りますか?

コンピュータの話とか食べ物の話とか旅行とかいろいろ

tomcatをsystemdに登録する手順(CentOS8)

実現したいこと

  • apache-tomcat公式のtar.gzをダウンロードしてCentOS8のsystemdに登録する。
  • systemctl restart tomcat コマンドが正常に実行できるようにする。
  • プロセスの実行ユーザーはtomcat

用意するもの、環境

  • OS: CentOS8
  • tomcat9.0
  • Adopt OpenJDK 11 (LTS)

手順

1.tomcat実行用ユーザーを作成

以下のコマンドを実行してtomcatユーザーを新規作成する。

# useradd -s /sbin/nologin tomcat

2.tomcatを準備

公式サイトからダウンロードした apache-tomcat.tar.gz を適当な場所に設置する。 自分は/opt/tomcatに設置してlatestリンクを作ってる。

# mkdir /opt/tomcat
# cd /opt/tomcat
# tar zxvf apache-tomcat-9.0.39.tar.gz
# ln -s /opt/tomcat/apache-tomcat-9.0.39 latest

こういう配置にする。

# ll /opt/tomcat/
drwxr-xr-x. 9 tomcat tomcat apache-tomcat-9.0.39
lrwxrwxrwx. 1 tomcat tomcat latest -> apache-tomcat-9.0.39

3.JDKを配置

# mdir /opt/jdk
# cd /opt/jdk
# cp OpenJDK11U-jdk_x64_linux_hotspot_11.0.9_11.tar.gz /opt/jdk
# tar zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.9_11.tar.gz
# ln -s jdk-11.0.9+11 latest

こういう配置にする。

# ll /opt/jdk/
drwxr-xr-x. 9 root root jdk-11.0.9+11
lrwxrwxrwx. 1 root root latest -> jdk-11.0.9+11

4.systemdのユニットファイルを作成

tomcatのユニットファイルを /usr/lib/systemd/system/tomcat.service に新規作成する。

/usr/lib/systemd/system/tomcat.service

[Unit]
Description=Apache Tomcat Servlet Container
After=syslog.target network.target

[Service]
Type=oneshot
User=tomcat
Group=tomcat
EnvironmentFile=/opt/tomcat/latest/bin/setenv.sh
ExecStart=/opt/tomcat/latest/bin/startup.sh
ExecStop=/opt/tomcat/latest/bin/shutdown_watching.sh
RemainAfterExit=yes
TimeoutSec=90

[Install]
WantedBy=multi-user.target

ユニットファイルを反映。

# systemctl daemon-reload

5.tomcatの起動スクリプトを作成

プロセス終了を監視するシャットダウンスクリプトを新規作成する。

/opt/tomcat/latest/bin/shutdown_watching.sh

#!/bin/sh

# const
TOMCAT_HOME=/opt/tomcat/latest
TOMCAT_USER=tomcat
SHUTDOWN_WAIT=60

# function
tomcat_pid() {
  echo `ps aux | grep org.apache.catalina.startup.Bootstrap | grep -v grep | awk '{ print $2 }'`
}

# shutdown.shでtomcatを停止する。
pid=$(tomcat_pid)
if [ -n "$pid" ]
then
    echo "Stoping Tomcat"
    /bin/sh $TOMCAT_HOME/bin/shutdown.sh

    # PIDが無くなるまで待機
    let kwait=$SHUTDOWN_WAIT
    count=0;
    until [ `ps -p $pid | grep -c $pid` -eq '0' ] || [ $count -gt $kwait ]
    do
        echo -n -e "/nwaiting for processes to exit";
        sleep 1
        let count=$count+1;
    done

    if [ $count -gt $kwait ]; then
        echo -n -e "/nkilling processes which didn't stop after $SHUTDOWN_WAIT seconds"
        kill $pid
    fi
else
    echo "Tomcat is not running"
    exit 0  # success
fi

exit 0    # success

6.tomcatJava関連設定

tomcatはstartup.shと同じディレクトリにsetenv.shを設置すると起動時に読み込んでくれる。 以下を新規作成してJAVA_HOMEを設定する。JAVA_HOME以外は省略しても動くと思うが、一応設定してる。

/opt/tomcat/latest/bin/setenv.sh

#!/bin/sh
JAVA_HOME="/opt/jdk/latest"
CATALINA_HOME="/opt/tomcat/latest"
CATALINA_BASE="/opt/tomcat/latest"
CATALINA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=256M -Xmx2548m"

以上で準備完了。

動作確認

起動したりログを見たりプロセスを確認したりして正常に動作することを確認。

# systemctl start tomcat
# systemctl status tomcat
# ps -ef | grep tomcat
# systemctl restart tomcat
# systemctl stop tomcat
# ps -ef | grep tomcat

以上。