linuxtomcatstartup.sh,tomcat启动脚本startup.sh分析
⼀、分析说明
为了写出更加完善的tomcat启动⽅⾯的⾃动化脚本,健壮⾃⼰⽤于代码上线⾃动化部署的脚本,特分析下tomcat的bin⽬录下的starup.sh 脚本,学习标准的sh脚本的编写⽅法,从中吸取经验
⼆、脚本分析#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
linux循环执行命令脚本# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
#
# $Id: startup.sh 1130937 2011-06-03 08:27:13Z markt $
# -----------------------------------------------------------------------------
# Better OS/400 detection: see Bugzilla 31132
os400=false
darwin=false
#os400是 IBM的AIX
#darwin是MacOSX 操作环境的操作系统成份
#Darwin是windows平台上运⾏的类UNIX模拟环境
case "`uname`" in
CYGWIN*) cygwin=true;;
OS400*) os400=true;;
Darwin*) darwin=true;;
esac
#上⼀个判断是为了判断操作系统,⾄于何⽤,往下看
# resolve links - $0 may be a softlink
#读取脚本名
PRG="$0"
#test –h File ⽂件存在并且是⼀个符号链接(同-L)
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
#上⾯循环语句的意思是保证⽂件路径不是⼀个连接,使⽤循环直⾄到⽂件原地址
#遇到⼀时看不明⽩的shell,可以拆解后⾃⼰在linux反复运⾏验证,⼀点点拆解就会明⽩的
#link=`expr "$ls" : '.*-> \(.*\)$'` 模拟后: expr 'lrwxrwxrwx 1 root root 19 3⽉  17 10:12 ./bbb.sh -> /root/shell/test.sh' : '.*-> \ (.*\)$'
#很明确的发现是⽤expr来提取/root/shell/test.sh的内容
#⽽这个循环就可以明确其⽬的,排除命令为链接,出命令真正的⽬录,防⽌后⾯的命令出错
#这段代码如果在以后有这⽅⾯的出链接源头的需求可以完全借鉴
#获取这个脚本的⽬录
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
#这个eval还没有理解
else
if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
#判断脚本catalina.sh是否存在并有可执⾏权限,没有执⾏权限就退出
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
exec "$PRGDIR"/"$EXECUTABLE" start "$@"
#exec命令在执⾏时会把当前的shell process关闭,然后换到后⾯的命令继续执⾏。
#exec命令可以很好的进⾏脚本之间过渡,并且结束掉前⼀个脚本这样不会对后⾯执⾏的脚本造成⼲扰。
#exec 命令:常⽤来替代当前 shell 并重新启动⼀个 shell,换句话说,并没有启动⼦ shell。使⽤这⼀命令时任何现
#有环境都将会被清除。exec 在对⽂件描述符进⾏操作的时候,也只有在这时,exec 不会覆盖你当前的 shell 环境。
#exec 可以⽤于脚本执⾏完启动需要启动另⼀个脚本是使⽤,但须考虑到环境变量是否被继承。
三、总结
tomcat的startup.sh脚本主要⽤来判断环境,到catalina.sh脚本源路径,将启动命令参数传递给catalina.sh执⾏。然⽽catalina.sh脚本中也涉及到判断系统环境和到catalina.sh脚本原路径的相关代码,所以执⾏tomcat启动时,⽆需使⽤startup.sh脚本(下⼀篇分析的shutdown.sh也类似),直接./catalina.sh start|stop|restart 即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。