Tomcatをデーモンで起動する

#Tomcat をインストールしても、デフォルトではデーモンで起動してくれないので、デーモンで起動するようにした際の備忘録。

##環境
| Software         |Version            |
|:-----------------|:------------------|
| OS               |CentOS7.3          |
| Tomcat           |7.0.82             |

##前提
・JDKは、wgetでダウンロードできないので、以下ディレクトリへ配備済み。

```
/usr/java/jdk1.8.0_152
```

##tomcat ユーザを作成する。

```
groupadd tomcat
useradd -M tomcat -g tomcat
```
##gcc をインストールする。

```
yum install gcc
=======================================================================================================================================
 Package                         アーキテクチャー        バージョン                           リポジトリー                        容量
=======================================================================================================================================
インストール中:
 gcc                             x86_64                  4.8.5-16.el7_4.1                     ol7_x86_64_latest                   16 M
依存性関連でのインストールをします:
 cpp                             x86_64                  4.8.5-16.el7_4.1                     ol7_x86_64_latest                  5.9 M
 glibc-devel                     x86_64                  2.17-196.el7_4.2                     ol7_x86_64_latest                  1.1 M
 glibc-headers                   x86_64                  2.17-196.el7_4.2                     ol7_x86_64_latest                  675 k
 kernel-headers                  x86_64                  3.10.0-693.11.1.el7                  ol7_x86_64_latest                  6.0 M
 libmpc                          x86_64                  1.0.1-3.el7                          ol7_x86_64_latest                   49 k
 mpfr                            x86_64                  3.1.1-4.el7                          ol7_x86_64_latest                  198 k
依存性関連での更新をします:
 glibc                           i686                    2.17-196.el7_4.2                     ol7_x86_64_latest                  4.2 M
 glibc                           x86_64                  2.17-196.el7_4.2                     ol7_x86_64_latest                  3.6 M
 glibc-common                    x86_64                  2.17-196.el7_4.2                     ol7_x86_64_latest                   11 M
 libgcc                          i686                    4.8.5-16.el7_4.1                     ol7_x86_64_latest                  105 k
 libgcc                          x86_64                  4.8.5-16.el7_4.1                     ol7_x86_64_latest                   98 k
 libgomp                         x86_64                  4.8.5-16.el7_4.1                     ol7_x86_64_latest                  153 k

トランザクションの要約
=======================================================================================================================================
インストール  1 パッケージ (+6 個の依存関係のパッケージ)
更新                       ( 6 個の依存関係のパッケージ)
```


##Tomcat をダウンロードする。
適当なディレクトリへダウンロードする。

```
wget http://ftp.jaist.ac.jp/pub/apache/tomcat/tomcat-7/v7.0.82/bin/apache-tomcat-7.0.82.tar.gz
```
##ダウンロードしたTomcatを解凍する。

```
tar -xvzf ./apache-tomcat-7.0.82.tar.gz
```
##解凍したTomcat を配備する。
今回は、/opt/の配下に配備した。

```
mv ./apache-tomcat-7.0.82/ /opt/.
```
##tomcat-daemon-native を解凍する。

```
cd /opt/apache-tomcat-7.0.82/bin/
tar -xvzf commons-daemon-native.tar.gz
```

##解凍したtomcat-daemon-native ディレクトリへ移動する。

```
cd ./commons-daemon-1.0.15-native-src/unix/
```

##tomcat-daemon-native をconfigure する。

```
export CFLAGS=-m64
export LDFLAGS=-m64
./configure --with-java=/usr/java/jdk1.8.0_152/

*** Current host ***
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking cached host system type... ok
*** C-Language compilation tools ***
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for ranlib... ranlib
checking for strip... strip
*** Host support ***
checking C flags dependant on host system type... ok
*** Java compilation tools ***
checking JAVA_HOME... /usr/java/jdk1.8.0_152/
checking for JDK os include directory...  linux
gcc flags added
checking how to run the C preprocessor... gcc -E
checking for egrep... grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking sys/capability.h usability... no
checking sys/capability.h presence... no
checking for sys/capability.h... no
configure: WARNING: cannot find headers for libcap
*** Writing output files ***
configure: creating ./config.status
config.status: creating Makefile
config.status: creating Makedefs
config.status: creating native/Makefile
*** All done ***
Now you can issue "make"
```

##エラーが無いことを確認し、make する。

```
make

(cd native; make  all)
make[1]: ディレクトリ `/opt/apache-tomcat-7.0.82/bin/commons-daemon-1.0.15-native-src/unix/native' に入ります
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes   -I/usr/java/jdk1.8.0_152//include -I/usr/java/jdk1.8.0_152//include/linux -c jsvc-unix.c -o jsvc-unix.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes   -I/usr/java/jdk1.8.0_152//include -I/usr/java/jdk1.8.0_152//include/linux -c arguments.c -o arguments.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes   -I/usr/java/jdk1.8.0_152//include -I/usr/java/jdk1.8.0_152//include/linux -c debug.c -o debug.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes   -I/usr/java/jdk1.8.0_152//include -I/usr/java/jdk1.8.0_152//include/linux -c dso-dlfcn.c -o dso-dlfcn.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes   -I/usr/java/jdk1.8.0_152//include -I/usr/java/jdk1.8.0_152//include/linux -c dso-dyld.c -o dso-dyld.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes   -I/usr/java/jdk1.8.0_152//include -I/usr/java/jdk1.8.0_152//include/linux -c help.c -o help.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes   -I/usr/java/jdk1.8.0_152//include -I/usr/java/jdk1.8.0_152//include/linux -c home.c -o home.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes   -I/usr/java/jdk1.8.0_152//include -I/usr/java/jdk1.8.0_152//include/linux -c java.c -o java.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes   -I/usr/java/jdk1.8.0_152//include -I/usr/java/jdk1.8.0_152//include/linux -c location.c -o location.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes   -I/usr/java/jdk1.8.0_152//include -I/usr/java/jdk1.8.0_152//include/linux -c replace.c -o replace.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes   -I/usr/java/jdk1.8.0_152//include -I/usr/java/jdk1.8.0_152//include/linux -c locks.c -o locks.o
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes   -I/usr/java/jdk1.8.0_152//include -I/usr/java/jdk1.8.0_152//include/linux -c signals.c -o signals.o
ar cr libservice.a arguments.o debug.o dso-dlfcn.o dso-dyld.o help.o home.o java.o location.o replace.o locks.o signals.o
ranlib libservice.a
gcc   jsvc-unix.o libservice.a -ldl -lpthread -o ../jsvc
make[1]: ディレクトリ `/opt/apache-tomcat-7.0.82/bin/commons-daemon-1.0.15-native-src/unix/native' から出ます
```

##tomcat-daemon-native (jsvc) が作成されていることを確認する。

```
ls- altr jsvc
-rwxr-xr-x 1 root  root  170552 12月 14 15:17 jsvc
```

##作成したtomcat-daemon-native (jsvc) を、tomcat インストールディレクトリ配下の/bin ディレクトリへ移動する。

```
mv ./jsvc ../../.
```

##Tomcat を配備したディレクトリのオーナーを tomcat へ変更する。

```
chown -R tomcat. /opt/apache-tomcat-7.0.82/
```

##tomcat 起動スクリプトを編集する。

```
vi /etc/systemd/system/tomcat.service

[Unit]
 Description=Apache Tomcat 7
 After=network.target

[Service]
 Type=forking
 User=tomcat
 Group=tomcat
 EnvironmentFile=/etc/sysconfig/tomcat

 ExecStart=/opt/apache-tomcat-7.0.82/bin/jsvc \
            -Djava.util.logging.config.file=${LOGGING_PROPERTIES} \
            -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
            -Dcatalina.home=${CATALINA_HOME} \
            -Dcatalina.base=${CATALINA_BASE} \
            -Djava.io.tmpdir=${CATALINA_TMPDIR} \
            -java-home ${JAVA_HOME} \
            -pidfile ${CATALINA_PID} \
            ${CATALINA_OPTS} \
            -cp ${CLASS_PATH} \
            org.apache.catalina.startup.Bootstrap

 ExecStop=/opt/apache-tomcat-7.0.82/bin/jsvc \
            -pidfile ${CATALINA_PID} \
            -stop \
            org.apache.catalina.startup.Bootstrap

[Install]
 WantedBy=multi-user.target
```

##tomcat 起動スクリプト用環境変数ファイルを作成する。

```
vi /etc/sysconfig/tomcat

JAVA_HOME="/usr/java/jdk1.8.0_152"
JRE_HOME="/usr/java/jdk1.8.0_152"

CATALINA_HOME="/opt/apache-tomcat-7.0.82"
CATALINA_BASE="/opt/apache-tomcat-7.0.82"
CATALINA_TMPDIR="/opt/apache-tomcat-7.0.82/temp"
CATALINA_PID="/opt/apache-tomcat-7.0.82/tomcat.pid"
LOGGING_PROPERTIES="/opt/apache-tomcat-7.0.82/conf/logging.properties"

CATALINA_OPTS="-XX:+AggressiveHeap -XX:+AggressiveOpts -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false -XX:+PrintGCDetails -XX:PermSize=128m -XX:MaxPermSize=256m"

CLASS_PATH="/usr/java/jdk1.8.0_152/lib/tools.jar:/opt/apache-tomcat-7.0.82/bin/commons-daemon.jar:/opt/apache-tomcat-7.0.82/bin/tomcat-juli.jar:/opt/apache-tomcat-7.0.82/bin/bootstrap.jar"
```

##DAEMON をリロードする。

```
systemctl daemon-reload
```

##tomcat を起動する。

```
systemctl start tomcat.service
```

##tomcat の状態を確認する。

```
systemctl status tomcat.service

● tomcat.service - Apache Tomcat 7
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2017-12-18 14:02:40 JST; 1 months 3 days ago
 Main PID: 25287 (jsvc)
   CGroup: /system.slice/tomcat.service
           tq25287 jsvc.exec -Djava.util.logging.config.file=/opt/apache-tomcat-7.0.82/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dcatalina.home=/opt/apache-tomcat-7.0.82 -Dcatalina.base...
           mq25288 jsvc.exec -Djava.util.logging.config.file=/opt/apache-tomcat-7.0.82/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dcatalina.home=/opt/apache-tomcat-7.0.82 -Dcatalina.base...
```

##tomcat の自動起動を有効にする。

```
systemctl enable tomcat.service
```

##tomcat の自動起動が有効になっているか確認する。

```
systemctl list-unit-files tomcat.service
UNIT FILE      STATE
tomcat.service enabled
```

#できた