■目的
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する(今回検証したけど証跡は省略)