Linux下Shell脚本完善

服务器上重启应用时经常在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秒判断一次卸载是否完成。没完成继续等待,反之逻辑继续。

完了测试,经过多次启停脚本测试后,没有再现以前的问题,解决问题!

你可能感兴趣的:(Linux下Shell脚本完善)