腳本的學習一直不得章法,之前都是囫圇吞棗式的學習,現在決定好好梳理下思路,看看究竟哪裏是弱項。之前詢問一個架構師大神,問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