1. 程式人生 > >tomcat啟動指令碼startup.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
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# 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 "
[email protected]
" #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 即可。