腳本的學習一直不得章法,以前都是囫圇吞棗式的學習,如今決定好好梳理下思路,看看究竟哪裏是弱項。以前詢問一個架構師大神,問shell腳本應該怎麼學習,人家回答了句,shell很簡單啊。如今想一想對於一個編程經驗豐富的人來講shell確實簡單,從我在學校中對c和c++的認識,足以感知到。人的思惟必定是先由總體再到過程。對於一個程序的開發來講,必定是先從總體邏輯框架再到具體細節處理。接下來我從一個腳本中去尋找個人知識的短板。java
題目要求:
在生產環境中,常常遇到tomcat沒法完全關閉,也就是說用tomcat自帶的shutdown.sh腳本沒法將java進程徹底關掉。因此須要藉助shell腳本,將進程殺死,而後再啓動。
寫個shell腳本,實現上述功能。備註:完全殺死一個進程的命令是kill -9 pidc++
題目分析:
1 題目要求腳本完成兩個任務,關閉java進程和成功啓動tomcat服務。因此它應該分爲兩部分:關閉和啓動。就目前題目要求來講,咱們只須要寫stop和start兩個函數,而後分別調用函數便可。若是咱們要將其作成一個/etc/init.d/ 下面的啓動腳本。那麼只須要再該腳本基礎上加上case 結構,能夠執行stop和start選項。若是還須要一個重啓功能,那麼再定義一個restart函數,restsat功能就是先stop再start。在case多加一個條件就能夠。shell
2 過程當中須要注意的細節。 kill -9 殺進程比較危險有可能會致使一些數據丟失,儘可能少用。
3 啓動後要檢查是否啓動成功,能夠經過是否存在java進程來判斷。編程
腳本的總體框架就是:vim
#!/bin/bash tomcatdir=/usr/local/tomcat stop() { } start() { } stop start
具體代碼爲tomcat
#!/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
封裝爲能夠開機啓動的腳本bash
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