背景
LinuxCentOS7操作系统环境下,开机启动项的添加有两种方式:一种是传统的编辑脚本文件放置/etc/init.d目录下,使用chkconfig命令添加;另一种是编写服务文件,由systemd调用启动。
MySQL安装后的开机启动服务文件为mysql.service,就是systemd方式添加的,如果我们的Java web应用依赖与MySQL数据库服务的启动的话,使用chkconfig方式就可能出现tomcat比MySQL服务先启动的问题。
systemd命令可以指定服务直接的启动和依赖关系,基于此,我们可以编写tomcat.service文件来实现tomcat开机启动。
编写启动脚本
首先,需要准备tomcat的开机启动调用的脚本,本质就是一个shell脚本,接收启动参数如start、stop;间接调用tomcat的启动脚本startup.sh完成的。我们可以添加跟web应用相关的其他开机操作,如系统环境设置等。
#!/bin/bash
JAVA_HOME=/usr/java/jdk1.8.0_60
CATALINA_HOME=/usr/lib/tomcat
export JAVA_HOME
export CATALINA_HOME
start_tomcat=$CATALINA_HOME/bin/startup.sh
stop_tomcat=$CATALINA_HOME/bin/shutdown.sh
start() {
echo -n "Starting tomcat: "
${start_tomcat}
echo "tomcat start ok."
}
stop() {
echo -n "Shutting down tomcat: "
${stop_tomcat}
echo "tomcat stop ok."
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 10
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
esac
exit 0
touch/home/tomcat,vi编辑并输入上述脚本内容,即完成了开机脚本的编写。本质就是一个shell脚本,转而调用真正的tomcat的脚本。
编写服务文件
开机时,systemd会读取/etc/systemd/system目录下以.service后缀的文件。
cd /etc/systemd/system
touch tomcat.service
编写tomcat.service文件,内容如下
[Unit]
Description=MyTomcat
After=mysql.service
[Service]
Type=forking
# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0
ExecStart=/home/tomcat start
ExecStop=/home/tomcat stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
注意事项:
1 Unit里面的After配置在mysql.service服务启动之后,才开始该服务
2TimeoutSec=0让开机启动不处理tomcat启动超时,保证tomcat耗时过长时不会被系统terminating。
3可以指定PIDFile为/run目录的下某个文件,如/run/mytomcat.pid但是不应该用tomcat.pid,我们这里配置的是tomcat开机启动服务的PID文件,真正的tomcat进程也会有一个tomcat.pid的进程编号文件,避免冲突。
4 ExecStart和ExecStop是指定服务的启动脚本,如果没有第一步编写的tomcat脚本的话,可以直接用为tomcat/bin/startup.sh的。
启动服务
编写完成tomcat.service文件后,使用systemctl enable tomcat.service命令添加服务。systemctl start/stop/status tomcat.service启动、停止、状态查看。
此外service文件修改后需要调用systemctl daemon-reload命令重新加载。
启示录
首先,以这种方式添加tomcat之后,使用jps命令查看Java进程时,是找不到tomcat进程的,只能用ps -ef|grep java方式才能查到。这点与chkconfig方式不同。
其次,这种方式真正的tomcat脚本启动后会在根目录下生成一个tomcat.pid的进程文件,而chkconfig方式却不会。
第三,chkconfig方式添加开机启动时,如果启动脚本中想等待其他服务完成而执行了sleep命令的话,会出现超时中断启动问题。
Dec 6 19:17:21 localhost systemd: tomcat.service start operation timed out. Terminating.
Dec 6 19:17:21 localhost systemd: Failed to start SYSV: Starts and Stops the Tomcat daemon..
Dec 6 19:17:21 localhost systemd: Unit tomcat.service entered failed state.
Dec 6 19:17:21 localhost systemd: tomcat.service failed.
第四,Linux的系统日志文件/var/log/messages里面记录系统开机启动的所有日志信息,一般服务启动操作都是有成对日志信息的,例如MySQL的日志信息:
Starting MySQL Server…
Started MySQL Server.
Starging MyTomcat…
Started MyTomcat
配置MyTomcat启动Aftemysql.service后,日志就是上述这样的顺序了。