Posted on 2010-10-11 20:17
默認(rèn)為零 閱讀(560)
評(píng)論(0) 編輯 收藏 所屬分類:
技術(shù)
服務(wù)器上重啟應(yīng)用時(shí)經(jīng)常在shutdown jboss階段卡死等待,但是單獨(dú)手工執(zhí)行jboss shutdown.sh都是正常的。感覺(jué)還是調(diào)用shutdown.sh的腳本出了問(wèn)題,遂仔細(xì)分析下shell編寫(xiě)的相關(guān)起停腳本,還是發(fā)現(xiàn)一點(diǎn)小問(wèn)題的。其中封裝的stop腳本如下:
stop()
{
jboss_jndi_port=1099
STR=`ps -C java -f --width 2000 | grep " $CUSTOM_PATH"`
echo "$CUSTOM_PATH"
echo "$STDOUT_LOG"
echo "$STR"
if [ ! -z "$STR" ]; then
while !(`grep "Halting VM" $STDOUT_LOG >/dev/null`)
do
sh $JBOSS_HOME/bin/shutdown.sh --server=localhost:1099 -S > /dev/null 2>&1
echo -e "* \c"
sleep 5
done
echo "JBoss已經(jīng)關(guān)閉"
else
echo "沒(méi)有Java進(jìn)程"
fi
$BASE_HOME/bin/apachectl stop
JBOSS_CLASSPATH=""
export JBOSS_CLASSPATH
}
意思是這樣的:
1、首先通過(guò)$CUSTOM_PATH這個(gè)變量代表的字符串過(guò)濾出jboss進(jìn)程,賦值為$STR。
2、$STR不為空,則循環(huán)判斷jboss啟停日志中是否出現(xiàn)“Halting VM”,未出現(xiàn)則執(zhí)行jboss shutdown.sh,然后等待5秒后再次判斷,如果還未出現(xiàn)則再次啟動(dòng)shutdown.sh。直到日志“Halting VM”出現(xiàn)后邏輯繼續(xù)往下走,echo "JBoss已經(jīng)關(guān)閉"等等。
這樣看來(lái),邏輯應(yīng)該有點(diǎn)問(wèn)題。假如5秒內(nèi)jboss沒(méi)有shutdown完畢,java進(jìn)程還在的情況下,重復(fù)執(zhí)行jboss shutdown.sh是有問(wèn)題的,這或許就是停止jboss服務(wù)過(guò)程中卡死等待的真正原因,于是著手修改腳本:
stop()
{
jboss_jndi_port=1099
STR=`ps -C java -f --width 2000 | grep " $CUSTOM_PATH"`
echo "$CUSTOM_PATH"
echo "$STDOUT_LOG"
echo "$STR"
if [ ! -z "$STR" ]; then
sh $JBOSS_HOME/bin/shutdown.sh --server=localhost:1099 -S > /dev/null 2>&1
while !(`grep "Halting VM" $STDOUT_LOG >/dev/null`)
do
echo -e "* \c"
sleep 5
done
echo "JBoss已經(jīng)關(guān)閉"
else
echo "沒(méi)有Java進(jìn)程"
fi
$BASE_HOME/bin/apachectl stop
JBOSS_CLASSPATH=""
export JBOSS_CLASSPATH
}
判斷jboss進(jìn)程存在,則調(diào)用jboss shutdown正常卸載其服務(wù),每隔5秒判斷一次卸載是否完成。沒(méi)完成繼續(xù)等待,反之邏輯繼續(xù)。
完了測(cè)試,經(jīng)過(guò)多次啟停腳本測(cè)試后,沒(méi)有再現(xiàn)以前的問(wèn)題,解決問(wèn)題!