■目的

Type=forkingでtomcat8(apache本家サイトのtarパッケージ)を起動する

 

■凡例

→:フォアグラウンド実行、⇒:バックグラウンド実行、➡:exec実行とする

 

■起動構成(デフォルト)

・tomcat起動までに実行されるコマンド(スクリプト)

$CATALINA_BASE/bin/startup.sh が $CATALINA_BASE/bin/catalina.sh を実行して最後に $JAVA_HOME/bin/java が実行される

・各コマンドの実行方法

startup.sh ➡ catalina.sh ⇒ java

 

【検証1】

起動プロセスであるstartup.shをTimeoutStartSecまでに終了させても、catalina.shによるcatalina.pidファイル作成がTimeoutStartSecを超過した場合に起動完了判定はNGになることを確認する。

 

[ポイント]

・起動プロセス(startup.shを実行する非対話bash)でcatalina.shをバックグラウンド起動にして即座に終了させる 

こうすることで、startup.shを実行する非対話bashの終了時間がTimeoutStartSecを絶対超えないようにする

・catalina.shを実行する非対話bashの冒頭部分に、TimeoutStartSecを超過させるためにsleepコマンドを実行させる

 

・UNITファイル

せ7> cat /usr/lib/systemd/system/tomcat8.service
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/local/tomcat8/bin/startup.sh
ExecStop=/usr/local/tomcat8/bin/shutdown.sh
PIDFile=/usr/local/tomcat8/tomcat.pid
SuccessExitStatus=143
TimeoutStartSec=10           ←検証のためにあえて短くする
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target

 

・$CATALINA_BASE/bin/startup.sh

せ7> diff startup.sh.org startup.sh
60c60,61
< exec "$PRGDIR"/"$EXECUTABLE" start "$@"
---
> "$PRGDIR"/"$EXECUTABLE" start "$@" &   ←デフォルトのままが推奨だがあえてバックグラウンド起動にする

 

・$CATALINA_BASE/bin/catalina.sh

せ7> diff catalina.sh.org catalina.sh
2a3
> sleep 11          ←TimeoutStartSecを超過させるために10秒以上sleepさせる        --------①
121a123,125
> CATALINA_BASE=/usr/local/tomcat8               ←デフォルトでは書かれてないので書く
> CATALINA_PID="$CATALINA_BASE/tomcat.pid"        ←デフォルトでは書かれてないのでpidファイルを作成させる(これはType=forkingの場合は必須。もちろん別の場所に書いてもよい)

 

・早速tomcat8を起動してみるんご

せ7> systemctl daemon-reload

せ7> systemctl status tomcat8
● tomcat8.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat8.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
・・・後略・・・

せ7> systemctl start tomcat8
Job for tomcat8.service failed because a timeout was exceeded. See "systemctl status tomcat8.service" and "journalctl -xe" for details.
せ7> systemctl status tomcat8
tomcat8.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat8.service; disabled; vendor preset: disabled)
   Active: failed (Result: timeout) since 水 2018-04-25 22:44:01 JST; 3s ago
  Process: 5322 ExecStart=/usr/local/tomcat8/bin/startup.sh (code=exited, status=0/SUCCESS)
 4月 25 22:43:51 centos7 systemd[1]: Starting Apache Tomcat Web Application Container...
 4月 25 22:43:51 centos7 systemd[1]: PID file /usr/local/tomcat8/tomcat.pid not readable (yet?) after start.   ←pidファイルがつくられてないんご
 4月 25 22:44:01 centos7 systemd[1]: tomcat8.service start operation timed out. Terminating.
 4月 25 22:44:01 centos7 systemd[1]: Failed to start Apache Tomcat Web Application Container.
 4月 25 22:44:01 centos7 systemd[1]: Unit tomcat8.service entered failed state.
 4月 25 22:44:01 centos7 systemd[1]: tomcat8.service failed.

→はい予想通りタイムアウトで失敗~!

・上記の①のsleepをTimeoutStartSec以下の9秒にしてもう一度tomcat8を起動してみるんご

せ7> head -2 catalina.sh
#!/bin/sh
sleep 9                              ←TimeoutStartSec(=10)以下にする

せ7> systemctl start tomcat8
せ7> systemctl status tomcat8

tomcat8.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat8.service; disabled; vendor preset: disabled)
   Active: active (running) since 水 2018-04-25 22:49:58 JST; 4s ago
  Process: 5370 ExecStart=/usr/local/tomcat8/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 5386 (java)
   CGroup: /system.slice/tomcat8.service
           mq5386 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.Cla...
 4月 25 22:49:49 centos7 systemd[1]: Starting Apache Tomcat Web Application Container...
 4月 25 22:49:49 centos7 systemd[1]: PID file /usr/local/tomcat8/tomcat.pid not readable (yet?) after start.
 4月 25 22:49:58 centos7 systemd[1]: Started Apache Tomcat Web Application Container.

→ちゃんと起動したんご

せ7> cat /usr/local/tomcat8/tomcat.pid
5637

せ7> ps -ef | grep tomca[t]
tomcat     5637      1  4 22:56 ?        00:00:02 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dignore.endorsed.dirs= -classpath /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat8 -Dcatalina.home=/usr/local/tomcat8 -Djava.io.tmpdir=/usr/local/tomcat8/temp org.apache.catalina.startup.Bootstrap start

せ7> systemctl stop tomcat8

せ7> cat /usr/local/tomcat8/tomcat.pid
cat: /usr/local/tomcat8/tomcat.pid: そのようなファイルやディレクトリはありません     ←消えた

 

【検証2】

SuccessExitStatusディレクティブは必要か?

 

せ7> cat /usr/lib/systemd/system/tomcat8.service
・・・前略・・・
#SuccessExitStatus=143           ←これを注釈化

・・・後略・・・

せ7> systemctl daemon-reload

せ7> systemctl start tomcat8

--- しばらく待つ ---

せ7> systemctl stop tomcat8
せ7> systemctl status tomcat8

● tomcat8.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat8.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
 4月 25 23:04:42 centos7 systemd[1]: PID file /usr/local/tomcat8/tomcat.pid not readable (yet?) after start.
 4月 25 23:04:42 centos7 systemd[1]: Started Apache Tomcat Web Application Container.
 4月 25 23:05:43 centos7 systemd[1]: Stopping Apache Tomcat Web Application Container...
 4月 25 23:05:43 centos7 shutdown.sh[5872]: Using CATALINA_BASE:   /usr/local/tomcat8
 4月 25 23:05:43 centos7 shutdown.sh[5872]: Using CATALINA_HOME:   /usr/local/tomcat8
 4月 25 23:05:43 centos7 shutdown.sh[5872]: Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
 4月 25 23:05:43 centos7 shutdown.sh[5872]: Using JRE_HOME:        /usr
 4月 25 23:05:43 centos7 shutdown.sh[5872]: Using CLASSPATH:       /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
 4月 25 23:05:43 centos7 shutdown.sh[5872]: Using CATALINA_PID:    /usr/local/tomcat8/tomcat.pid
 4月 25 23:05:44 centos7 systemd[1]: Stopped Apache Tomcat Web Application Container.

→なくても正常終了

 

【検証3】

PIDFileが無くてもいいか?

 

以前の検証では、ExecStartで指定される起動コマンドからメインプロセス起動まで2回以上forkする場合は、メインプロセスのpidを書いたpidファイルをPIDFileディレクティブに指定しないと、起動が失敗したり不安定になったので念のため検証するんご

 

せ7> cat /usr/lib/systemd/system/tomcat8.service
・・・前略・・・
#PIDFile=/usr/local/tomcat8/tomcat.pid       ←注釈化

・・・後略・・・

せ7> systemctl daemon-reload​​​​​​​

せ7> systemctl start tomcat8
せ7> systemctl status tomcat8

● tomcat8.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat8.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
 4月 25 23:11:54 centos7 shutdown.sh[5964]: at java.net.Socket.<init>(Socket.java:434)
 4月 25 23:11:54 centos7 shutdown.sh[5964]: at java.net.Socket.<init>(Socket.java:211)
 4月 25 23:11:54 centos7 shutdown.sh[5964]: at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:497)
 4月 25 23:11:54 centos7 shutdown.sh[5964]: at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 4月 25 23:11:54 centos7 shutdown.sh[5964]: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 4月 25 23:11:54 centos7 shutdown.sh[5964]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 4月 25 23:11:54 centos7 shutdown.sh[5964]: at java.lang.reflect.Method.invoke(Method.java:498)
 4月 25 23:11:54 centos7 shutdown.sh[5964]: at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:406)
 4月 25 23:11:54 centos7 shutdown.sh[5964]: at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)
 4月 25 23:11:54 centos7 shutdown.sh[5964]: The stop command failed. Attempting to signal the process to stop through OS signal.

→やっぱり起動しませんね

 

ちなみに、startup.shからcatalina.shの実行をバックグラウンド実行からexec実行に戻すと、PIDFileディレクティブを注釈しても、systemctl start tomcat8で起動できるようになる。(今回も検証したけど証跡は省略)

ただし、この場合、systemctl stop tomcat8で終了した場合、SuccessExitStatu=143 が無いと終了判定がNGとなる

せ7> systemctl stop tomcat8
せ7> systemctl status tomcat8

tomcat8.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat8.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 木 2018-04-26 10:46:40 JST; 2s ago
  Process: 3822 ExecStop=/usr/local/tomcat8/bin/shutdown.sh (code=exited, status=0/SUCCESS)
  Process: 3784 ExecStart=/usr/local/tomcat8/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 3798 (code=exited, status=143)
 4月 26 10:46:39 centos7 shutdown.sh[3822]: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 4月 26 10:46:39 centos7 shutdown.sh[3822]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 4月 26 10:46:39 centos7 shutdown.sh[3822]: at java.lang.reflect.Method.invoke(Method.java:498)
 4月 26 10:46:39 centos7 shutdown.sh[3822]: at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:406)
 4月 26 10:46:39 centos7 shutdown.sh[3822]: at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)
 4月 26 10:46:39 centos7 shutdown.sh[3822]: The stop command failed. Attempting to signal the process to stop through OS signal.
 4月 26 10:46:40 centos7 systemd[1]: tomcat8.service: main process exited, code=exited, status=143/n/a
 4月 26 10:46:40 centos7 systemd[1]: Stopped Apache Tomcat Web Application Container.
 4月 26 10:46:40 centos7 systemd[1]: Unit tomcat8.service entered failed state.
 4月 26 10:46:40 centos7 systemd[1]: tomcat8.service failed.

→systemctl stop tomcat8で終了した場合、SuccessExitStatu=143 があると終了判定をpassする(今回検証したけど証跡は省略)