一、概述
作为一个成熟的中间件产品,tomcat有很多值得我们学习的地方。下面我将从tomcat的运行脚本catalina.sh入手,分析tomcat的启动过程,以及tomcat脚本是如何实现停止tomcat服务的。
注意:此处分析的是linux环境下的脚本文件
二、tomcat目录结构
tomcat目录结构如下:
bin目录的内容如下:
- 可执行文件,包括startup.sh、shutdown.sh、catalina.sh
- tomcat启动所依赖的jar包,包括 bootstrap.jar、tomcat-juli.jar
三、脚本分析
我会介绍每个脚本的主要逻辑,并对涉及到的linux命令做简要介绍。脚本中做了大部分的注释,请结合注释理解。毕竟是代码,干说是很难描述的,注释效果更好。
startup.sh
#!/bin/sh
# 1)检测是否为os400操作系统
os400=false
case "`uname`" in
OS400*) os400=true;;
esac
# 2)PRG表示脚本路径,如果当前脚本文件为软链接,则会解析出PRG真正文件所在路径
# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ] ; do # -h 判断是否为软链接
ls=`ls -ld "$PRG"` # 如果为软链接,输出中含有 link -> source 的字串
link=`expr "$ls" : '.*-> \(.*\)$'` # 模式匹配出源文件的路径,对这里感觉模糊请搜索“expr模式匹配”
if expr "$link" : '/.*' > /dev/null; then # 匹配 /.*,这里expr会输出匹配个数,如果不为0,说明$link包含目录
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link" # 当不包含目录,说明软链接和源文件在同一目录
fi
done
#获取脚本目录路径
PRGDIR=`dirname "$PRG"`
EXECUTABLE=catalina.sh
# Check that target executable exists
if $os400; then
# -x will Only work on the os400 if the files are:
# 1. owned by the user
# 2. owned by the PRIMARY group of the user
# this will not work if the user belongs in secondary groups
eval
else
if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
echo "Cannot find $PRGDIR/$EXECUTABLE"
echo "The file is absent or does not have execute permission"
echo "This file is needed to run this program"
exit 1
fi
fi
# 3)执行catalina.sh start
exec "$PRGDIR"/"$EXECUTABLE" start "$@"
脚本主要逻辑如下:
1. 检测操作系统,以兼容特定操作系统的特性
- uname 显示操作系统信息
2. 获取脚本路径
这段代码几乎在所有启动脚本、停止脚本的开头都会出现。为了防止获取到的路径是软链接的路径,需要对路径做解析。
- expr命令解释
1)expr string : regex
这种形式下,会用:后面的正则表达式匹配前面的字符串,输出匹配的个数
2)expr string : xxx\(zzz\ )
这种形式下,\(zzz\