1、分析說明linux
爲了寫出更加完善的tomcat啓動方面的自動化腳本,健壯本身用於代碼上線自動化部署的腳本,特分析下tomcat的bin目錄下的starup.sh腳本,學習標準的sh腳本的編寫方法,從中吸收經驗. 2、腳本分析 #!/bin/sh
#shell
#express
#apache
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
#上一個判斷是爲了判斷操做系統,至於何用,往下看windows
#讀取腳本名
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的內容
#而這個循環就能夠明確其目的,排除命令爲連接,找出命令真正的目錄,防止後面的命令出錯
#這段代碼若是在之後有這方面的找出連接源頭的需求能夠徹底借鑑tomcat
#獲取這個腳本的目錄
PRGDIR=dirname "$PRG"
EXECUTABLE=catalina.shapp
#這些判斷是否氣是其餘的操做系統
if $os400; thenless
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 能夠用於腳本執行完啓動須要啓動另外一個腳本是使用,但須考慮到環境變量是否被繼承。
3、總結ide
tomcat的startup.sh腳本主要用來判斷環境,找到catalina.sh腳本源路徑,將啓動命令參數傳遞給catalina.sh執行。然而catalina.sh腳本中也涉及到判斷系統環境和找到catalina.sh腳本原路徑的相關代碼,因此執行tomcat啓動時,無需使用startup.sh腳本(下一篇分析的shutdown.sh也相似),直接./catalina.sh start|stop|restart 便可。