服務器上重啟應用時經常在shutdown jboss階段卡死等待,但是單獨手工執行jboss shutdown.sh都是正常的。感覺還是調用shutdown.sh的腳本出了問題,遂仔細分析下shell編寫的相關起停腳本,還是發現一點小問題的。其中封裝的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已經關閉"
else
echo "沒有Java進程"
fi
$BASE_HOME/bin/apachectl stop
JBOSS_CLASSPATH=""
export JBOSS_CLASSPATH
}
意思是這樣的:{
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已經關閉"
else
echo "沒有Java進程"
fi
$BASE_HOME/bin/apachectl stop
JBOSS_CLASSPATH=""
export JBOSS_CLASSPATH
}
1、首先通過$CUSTOM_PATH這個變量代表的字符串過濾出jboss進程,賦值為$STR。
2、$STR不為空,則循環判斷jboss啟停日志中是否出現“Halting VM”,未出現則執行jboss shutdown.sh,然后等待5秒后再次判斷,如果還未出現則再次啟動shutdown.sh。直到日志“Halting VM”出現后邏輯繼續往下走,echo "JBoss已經關閉"等等。
這樣看來,邏輯應該有點問題。假如5秒內jboss沒有shutdown完畢,java進程還在的情況下,重復執行jboss shutdown.sh是有問題的,這或許就是停止jboss服務過程中卡死等待的真正原因,于是著手修改腳本:
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已經關閉"
else
echo "沒有Java進程"
fi
$BASE_HOME/bin/apachectl stop
JBOSS_CLASSPATH=""
export JBOSS_CLASSPATH
}
判斷jboss進程存在,則調用jboss shutdown正常卸載其服務,每隔5秒判斷一次卸載是否完成。沒完成繼續等待,反之邏輯繼續。{
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已經關閉"
else
echo "沒有Java進程"
fi
$BASE_HOME/bin/apachectl stop
JBOSS_CLASSPATH=""
export JBOSS_CLASSPATH
}
完了測試,經過多次啟停腳本測試后,沒有再現以前的問題,解決問題!