生产环境-linux-tomcat宕掉-乌龙事件

    最近两天上线版本,总是发现tomcat重启后一个小时内服务关闭,已经排除是内存泄露的问题,关于如何排除内存泄露嫌疑,请看我这边日志的姐妹篇:生产环境-linux-tomcat宕掉解决办法 

    其实不能归纳为tomcat服务宕掉,虽然web访问不了,tomcat服务还在正常跑,只是日志出现此提示:

2015-3-16 16:24:41 org.apache.coyote.http11.Http11NioProtocol pause
信息: Pausing Coyote HTTP/1.1 on http-88**
2015-3-16 16:24:42 org.apache.catalina.core.StandardService stop
信息: Stopping service Catalina
2015-3-16 16:24:42 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc

    没有其他多余的信息,一直怀疑是系统引起问题或者tomcat进程问题,这时候开发同事在测试的时候发现了个问题,使用SecureCRT连接服务器,用我的脚本重启后,直接关闭SecureCRT,tomcat访问页面就会访问不了,我这边也经过反复测试,发现问题确实出现在脚本上:

#!/bin/sh
#auther: gushao
#date: 2014-12-23
#aim: tomcat restart
tomcat_home=/home/resin/tomcat
tomcat_pid=`ps -ef | grep java | grep $tomcat_home | grep -v ‘grep‘  | awk ‘{print $2}‘`
remove_log() {
        test -d $tomcat_home/logs/catalina ||  mkdir $tomcat_home/logs/catalina
        mv $tomcat_home/logs/catalina2* $tomcat_home/logs/catalina
        mv $tomcat_home/logs/catalina.2* $tomcat_home/logs/catalina
  test -f   $tomcat_home/logs/catalina.out  && mv $tomcat_home/logs/catalina.out  $tomcat_home/logs/catalina`date +%Y-%m-%d_%H%M%S`.out || echo "$tomcat_home/logs/catalina.out is not exist"
  #test -f   $tomcat_home/tnx/tnx.web.log  && mv $tomcat_home/tnx/tnx.web.log  $tomcat_home/tnx/tnx.web.`date +%Y-%m-%d_%H%M%S`.log || echo "$tomcat_home/tnx/tnx.web.log is not exist"
}
case $1 in
stop)
if [ -z $tomcat_pid ];then
        remove_log
        echo " tomcat已经是停止状态"
        exit
else
        kill -9 $tomcat_pid
        remove_log
fi
;;
start)
if [ -z $tomcat_pid ];then
        $tomcat_home/bin/catalina.sh start  
        tail -f   $tomcat_home/logs/catalina.out 
else
        kill -9 $tomcat_pid
        sleep 6
        remove_log
        $tomcat_home/bin/catalina.sh start
       tail -f  $tomcat_home/logs/catalina.out
fi
;;
restart)
if [ -z $tomcat_pid ];then
        remove_log
else
        kill -9 $tomcat_pid
        sleep 6
        remove_log
fi
$tomcat_home/bin/catalina.sh start 
  tail -f   $tomcat_home/logs/catalina.out 
;;
*)
echo "你的输入有误"
;;
esac

    为了方便重启后查看日志,在重启后是直接输出日志,而平时我都是看启动日志正常后,ctrl+c退出tail,这样是没有问题的,但是回想起来出现问题的那几次很可能是我一直没有关闭tail,直到SecureCRT超时自动关闭,或者没有先退出tail日志直接关闭了SecureCRT。

    至于为什么直接关闭SecureCRT会导致tomcat居然会暂停web服务和端口

    当登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。当用户退出Linux登录时,系统会给这个session所关联的所有进程发送SIGHUP信号,前台进程组和后台对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。

        我是怀疑和这个有关,但是这个不是重点,重点在我写的脚本上,一下是修改后的脚本:

#!/bin/sh
#auther: gushao
#date: 2014-12-23
#aim: tomcat restart
tomcat_home=/home/resin/tomcat
tomcat_pid=`ps -ef | grep java | grep $tomcat_home | grep -v ‘grep‘  | awk ‘{print $2}‘`
remove_log() {
        test -d $tomcat_home/logs/catalina ||  mkdir $tomcat_home/logs/catalina
        mv $tomcat_home/logs/catalina2* $tomcat_home/logs/catalina
        mv $tomcat_home/logs/catalina.2* $tomcat_home/logs/catalina
  test -f   $tomcat_home/logs/catalina.out  && mv $tomcat_home/logs/catalina.out  $tomcat_home/logs/catalina`date +%Y-%m-%d_%H%M%S`.out || echo "$tomcat_home/logs/catalina.out is not exist"
  #test -f   $tomcat_home/tnx/tnx.web.log  && mv $tomcat_home/tnx/tnx.web.log  $tomcat_home/tnx/tnx.web.`date +%Y-%m-%d_%H%M%S`.log || echo "$tomcat_home/tnx/tnx.web.log is not exist"
}
case $1 in
stop)
if [ -z $tomcat_pid ];then
        remove_log
        echo " tomcat已经是停止状态"
        exit
else
        kill -9 $tomcat_pid
        remove_log
fi
;;
start)
if [ -z $tomcat_pid ];then
        $tomcat_home/bin/catalina.sh start  &
        tail -f   $tomcat_home/logs/catalina.out 
else
        kill -9 $tomcat_pid
        sleep 6
        remove_log
        $tomcat_home/bin/catalina.sh start
fi
;;
restart)
if [ -z $tomcat_pid ];then
        remove_log
else
        kill -9 $tomcat_pid
        sleep 6
        remove_log
fi
$tomcat_home/bin/catalina.sh start &
;;
*)
echo "你的输入有误"
;;
esac

exit 0

    可以说是exit引发的血案啊,需要重点说明的有几点:

1.shell脚本在结束后加上一定要加上exit,不然绝对是坑啊,不是碰巧开发遇到,脑子想破也想不出来啊...

2.shell单个功能尽量简单,不要带过多无用的功能,可以分模块,但不要都堆一起,不然相互以影响,就死翘翘了

3.做运维,尽量少偷懒,即时平时手工操作可能比写成脚本更方面,但是排错的时候就坑死人了,多写写自动化脚本没错的

          总结,这个算是作者踩坑的一次小总结,希望能给遇到类似情况的朋友一些启发,有时候很多好的经验都是好多人踩过坑后总结的,还是要抱着虚心的态度多学习学习,修炼好内功啊,作者这就去闭关修炼也~~~

         



    


本文出自 “运维路上” 博客,请务必保留此出处http://vekergu.blog.51cto.com/9966832/1621189

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。