linux中tomcat啟動腳本:關閉、發布、重啟、測試是否成功


說明

在使用jenkins持續集成時,需要實現自動發布包到tomcat。該腳本實現了在jenkins將包發送到linux服務器上后的自動關閉、發布、啟動、測試啟動是否成功的過程

思路

該思路以tomcat的啟動端口為8080,關閉端口為8005為例。tomcat自帶了啟動腳本startup.sh和停止腳本shutdown.sh,tomcat要在啟動后,並且監聽了shutdown端口后才能使用shutdown.sh腳本進行關閉。要實現該腳本需要以下步驟:

  1. 查看tomcat是否監聽了啟動端口。
    1. 如果tomcat的啟動端口8080正在被監聽則需要關閉tomcat。
    2. 關閉tomcat需要在這個時間里啟動端口8080還是處於被監聽狀態,這時需要查看關閉端口8005是否可用,如若可用那說明沒有進行過關閉,如果不可用說明已經執行了shutdown.sh腳本。
  2. tomcat關閉完成后,刪除原有包、刪除原有日志(視情況而定)、發布包、啟動腳本
  3. 執行完啟動腳本后就需要判斷是否啟動成功了,因本機設置了代理,所以需要臨時取消代理。
    1. 利用curl訪問測試的網頁,獲取返回的請求碼http_code。
    2. 如果請求碼http_code為000則說明tomcat還在啟動。
    3. 如果請求碼http_code為200則說明請求成功(視情況302也是請求成功的)。
    4. 在判斷過程中要加入tomcat啟動端口的判斷,如果啟動端口8080不可用,那說明tomcat啟動失敗了。

腳本

腳本內容如下:

#!/bin/sh
#set -o errexit
#默認tomcat文件夾名稱
tomcat_name=apache-tomcat-9.0.16

#默認檢查頁面
check_page=login.jsp

#默認檢查頁面
base_path=$(dirname $0)

#默認嘗試10次
max_try=10

while getopts ":u:d:p:t:m:b:" opt
do
    case $opt in
    	#tomcat的啟動端口
        u)
		startup_port=$OPTARG
        echo "啟動端口的值:$OPTARG"
        ;;
        #tomcat的關閉端口
        d)
		shutdown_port=$OPTARG
        echo "關閉端口的值:$OPTARG"
        ;;
        #測試的訪問頁面
        p)
		check_page=$OPTARG
        echo "測試的頁面為:$OPTARG"
        ;;
        #tomcat名稱
        t)
		tomcat_name=$OPTARG
        echo "tomcat名稱為:$OPTARG"
        ;;
        m)
		max_try=$OPTARG
        echo "base_path為:$OPTARG"
        ;;
        b)
		base_path=$OPTARG
        echo "base_path為:$OPTARG"
        ;;
        ?)
        echo "未知參數"
        ;;
    esac
done
if [[ "$startup_port" -eq "" ]] || [[ "$shutdown_port" -eq "" ]] ; then
	echo "必須要有u:$startup_port 啟動端口,d:$shutdown_port 關閉端口參數"
	exit 1
	#statements
fi
#檢查端口狀態
check_port_status (){
	if [[ $1 ]]; then
		echo "**********$(date):查看的端口:$1*********"
		return $(expr length "$(netstat -lnp|grep $1)")
	else
		echo "端口不能為空"
		exit 1
	fi
}

#查看url的返回碼
check_url_code () {
	if [[ $1 ]]; then
		echo "***********$(date):訪問的url:$1**********"
		return $(curl -I -m 10 -o /dev/null -s -w %{http_code}  $1)
	else
		echo "url不能為空"
		exit 1
	fi
}

check_port_status $startup_port
startup_status=$?


while [[ startup_status -ne 0 ]] 
do
echo "*****************$(date):等待tomcat關閉*******************"
sleep 5
#檢測tomcat是否關閉
check_port_status $startup_port
startup_status=$?

check_port_status $shutdown_port
shutdown_status=$?
if [[ shutdown_status -ne 0 ]]; then
		 echo “***************$(date)關閉tomcat****************” 
		 $base_path/$tomcat_name/bin/shutdown.sh
fi
done

echo "********************$(date):tomcat已是關閉狀態***************"


echo "***************刪除原有包********************"
rm -rf $base_path/$tomcat_name/webapps/*

echo "***************刪除以前的日志********************"
rm -rf $base_path/$tomcat_name/logs/*

#移動現有包
echo "***************將包發布在tomcat********************"

cp $base_path/ROOT.war $base_path/$tomcat_name/webapps/

#啟動命令
echo "***************啟動tomcat********************"

$base_path/$tomcat_name/bin/startup.sh


echo "*************臨時取消代理***************"
unset http_proxy
unset https_proxy
#判斷是否啟動成功

echo "*************等待啟動完成***************"
code=000
trys=0
#先睡5秒不然tomcat還沒有監聽端口
sleep 5
check_port_status $startup_port
startup_status=$?

while [[ code -eq 000  ]] && [[ trys -lt max_try ]] && [[ startup_status -ne 0 ]]

do
	sleep 10s
	check_url_code http://localhost:$startup_port/$check_page
	code=$?
	trys=`expr $trys + 1`
	check_port_status $startup_port
	startup_status=$?
	echo "*************$(date):第 $trys 次訪問 $check_page,返回碼為:$code***************"
	
done

if [[ startup_status -ne 0 ]] ;then

	if [[ code -eq 200 ]]; then
		echo "***************$(date):tomcat啟動成功,$check_page 訪問成功,訪問次數:$trys************"
		exit 0
	else 
		echo "***************$(date):tomcat啟動成功,$check_page 訪問失敗,訪問次數:$trys************"
		exit 500
	fi
else
	echo "***************$(date):tomcat啟動失敗,請查看啟動日志************"
	exit 500
fi

使用

腳本參數已經在注釋中說明,默認情況下該腳本需要和tomcat位於同一級目錄,tomcat文件夾的名稱為apache-tomcat-9.0.16。下面是示例

$ ./startup.sh -u 8080 -d 8005


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM