Posted on 2010-10-11 20:17
默认为零 阅读(545)
评论(0) 编辑 收藏 所属分类:
技术
服务器上重启应用时经常在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
}
意思是这样的:
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秒判断一次卸载是否完成。没完成继续等待,反之逻辑继续。
完了测试,经过多次启停脚本测试后,没有再现以前的问题,解决问题!