1. 程式人生 > >Linux學習總結(六十五)tomcat啟動腳本

Linux學習總結(六十五)tomcat啟動腳本

kcon 函數 script rgs 數據表 強制 $0 調用函數 AS

腳本的學習一直不得章法,之前都是囫圇吞棗式的學習,現在決定好好梳理下思路,看看究竟哪裏是弱項。之前詢問一個架構師大神,問shell腳本應該怎麽學習,人家回答了句,shell很簡單啊。現在想想對於一個編程經驗豐富的人來說shell確實簡單,從我在學校中對c和c++的認識,足以感知到。人的思維一定是先由整體再到過程。對於一個程序的開發來說,一定是先從整體邏輯框架再到具體細節處理。接下來我從一個腳本中去尋找我的知識的短板。

題目要求:
在生產環境中,經常遇到tomcat無法徹底關閉,也就是說用tomcat自帶的shutdown.sh腳本無法將java進程完全關掉。所以需要借助shell腳本,將進程殺死,然後再啟動。

寫個shell腳本,實現上述功能。備註:徹底殺死一個進程的命令是kill -9 pid

題目分析:
1 題目要求腳本完成兩個任務,關閉java進程和成功啟動tomcat服務。所以它應該分為兩部分:關閉和啟動。就目前題目要求來說,我們只需要寫stop和start兩個函數,然後分別調用函數即可。如果我們要將其做成一個/etc/init.d/ 下面的啟動腳本。那麽只需要再該腳本基礎上加上case 結構,可以執行stop和start選項。如果還需要一個重啟功能,那麽再定義一個restart函數,restsat功能就是先stop再start。在case多加一個條件就可以。

2 過程中需要註意的細節。 kill -9 殺進程比較危險有可能會導致一些數據丟失,盡量少用。

3 啟動後要檢查是否啟動成功,可以通過是否存在java進程來判斷。

腳本的整體框架就是:

#!/bin/bash
tomcatdir=/usr/local/tomcat

stop()
{
}

start()
{
}
stop
start

具體代碼為

#!/bin/bash
tomcatdir=/usr/local/tomcat    //指定tomcat的安裝路徑

stop()
{
    echo -n "stopping tomcat."
    killall java
    i=0
    while [ $i -lt 10 ]
    do
        if pgrep -l java &> dev/null    //pgrep -l 顯示進程名及pid,有數據表示非空,為真。
    then
        killall java
        sleep 1
        echo -n "."    //每嘗試一次輸出一個點,給出狀態提示。
        i=$[$i+1]
    else
        echo -e "\033[32m[0k]\033[0m"  //輸出綠色的帶中括號的ok字符
        break
    fi
    done
//程序一進來先用killall嘗試殺一遍進程,如果成功直接顯示綠色字體的[ok]退出,如果失敗,則再嘗試10次。
    if pgrep -l java &> /dev/null
    then
    pgrep java |xargs kill -9 &> /dev/null   // xargs 表示對列出的每個進程都殺一次
    sleep 1
    pgrep java |xargs kill -9 &> /dev/null
    fi
    if pgrep java &> /dev/null
    then
    echo "java 進程殺不掉,請檢查"
    exit
    fi
// 再次檢查進程,如果還存在,用kill -9 強制殺,嘗試兩次。殺不死,輸出提示信息。
}

start()
{
    cd $tomcatdir
    echo -n "starting tomcat."
    ./bin/startup.sh 2>/tmp/start_tomcat.log
    i=0
    while [ $i -lt 3 ]
    do
    if ! pgrep java &> /dev/null
    then
        ./bin/startup.sh 2>/tmp/start_tomcat.log
        echo -n "."
        i=$[$i+1]
    else
        echo -e "\033[32m[0k]\033[0m"
        break
    fi
    done
    if ! pgrep java &> /dev/null
    then
    cat /tmp/start_tomcat.log
    echo "tomcat 無法啟動,請檢查。"
    fi
}
// 程序一進來先嘗試啟動一次,如果成功直接輸出ok,如果還沒找掉進程,則嘗試三次。還是失敗的話,給出提示退出。
if ! rpm -q psmisc &> /dev/null
then
    echo "安裝psmic包。"
    yum install -y psmisc
fi
// 在調用函數之前,檢查帶有killall命令的包是否安裝,沒有使用yum安裝。
stop
start

封裝為可以開機啟動的腳本

vim /etc/init.d/tomcatd
#!/bin/bash
#chkconfig: 2345 80 20
#############################################################################
#this scripts is about tomcat start or stop
#############################################################################
function usage(){
    echo "$0 {start|stop|restart}"
}

if [ $# -ne 1 ];then
    usage
    exit 1
fi
tomcatdir=/usr/local/tomcat
start()
{
    cd $tomcatdir
    echo -n "starting tomcat."
    ./bin/startup.sh 2>/tmp/start_tomcat.log
    i=0
    while [ $i -lt 3 ]
    do
    if ! pgrep java &> /dev/null
    then
        ./bin/startup.sh 2>/tmp/start_tomcat.log
        echo -n "."
        i=$[$i+1]
    else
        echo -e "\033[32m[0k]\033[0m"
        break
    fi
    done
    if ! pgrep java &> /dev/null
    then
    cat /tmp/start_tomcat.log
    echo "tomcat 無法啟動,請檢查。"
    fi
}
stop()
{
    echo -n "stopping tomcat."
    killall java
    i=0
    while [ $i -lt 10 ]
    do
        if pgrep -l java &> dev/null  
    then
        killall java
        sleep 1
        echo -n "."    
        i=$[$i+1]
    else
        echo -e "\033[32m[0k]\033[0m"  
        break
    fi
    done
    if pgrep -l java &> /dev/null
    then
    pgrep java |xargs kill -9 &> /dev/null   
    sleep 1
    pgrep java |xargs kill -9 &> /dev/null
    fi
    if pgrep java &> /dev/null
    then
    echo "java 進程殺不掉,請檢查"
    exit
    fi
}
restart()
{ 
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restat
;;
esac

Linux學習總結(六十五)tomcat啟動腳本