生产环境-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.做运维,尽量少偷懒,即时平时手工操作可能比写成脚本更方面,但是排错的时候就坑死人了,多写写自动化脚本没错的

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

时间: 2024-10-07 06:30:34

生产环境-linux-tomcat宕掉-乌龙事件的相关文章

一般生产环境LINUX服务器配置

1.生产环境LINUX服务器系统版本的选择 选择CentOS6.5版本64位的LINUX操作系统 CentOS (Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于红帽的Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成.由于出自同样的源代码,因此和红帽商业版的RHEL系统用着同样的高度稳定性.两者的不同,在于CentOS并不包含红帽的商业支持和一些RHEL商业版隐藏的

生产环境Linux二进制安装配置MySQL

生产环境Linux二进制安装配置MySQL 一.环境检查rpm -qa |grep libaio #如果没有安装libaio则需要安装.df -hmount /dev/sr0 /mnt二.安装过程1)上传安装程序通过FTP/SFTP上传安装包2)创建创用户,组,创建目录groupadd mysqluseradd -r -g mysql -s /bin/false mysqlmkdir -p /mysql/data/3306/data这里的3306是MySQL默认端口号,/mysql/data目录

生产环境Linux安装

大多公司在部署服务时,因为Windows上服务过多,内存,CPU占用过高时,服务会出现假死,或者挂掉等情况,因此,没有特殊情况,首选都是在Linux上部署服务,下面将以VM演示生产环境Linux的安装. 首先,通过VMware创建虚拟机,若是第一次或者新手刚玩VM虚拟机,可以找找别的教程学学怎么创建虚拟机,这里直接演示Linux安装. 开启虚拟机后,进入安装界面,此时如图有两个选择: 第一个选项是直接安装,第二个是检查验证Linux完整性再进行安装,耗时会很久,所以通常选择第一个选项进行安装,接

生产环境中tomcat的配置

生产环境中要以daemon方式运行tomcat 通常在开发环境中,我们使用$CATALINA_HOME/bin/startup.sh来启动tomcat, 使用$CATALINA_HOME/bin/shutdown.sh来关闭tomcat. 而在生产环境中,我们要配置tomcat使其以daemon方式运行,这是因为: 以daemon运行不受终端影响,不会因为退出终端而停止运行 可以让tomcat以普通用户身份运行,可以让tomcat随linux启动而启动 如何将tomcat配置成守护进程 将tom

生产环境linux服务器系统安全配置

第一章  账户安全及权限 一.  禁用root以外的超级用户 1.  检测方法: cat /etc/passwd   查看口令文件,文件格式如下 login_name:password:user_ID:group_ID:comment:home_dir:command 若user_ID=0,则该用户拥有超级用户的权限.查看此处是否有多个ID=0 2.  检测命令: cat /etc/passwd | awk -F ':' '{print$1,$3}' | grep ' 0$' 3.  备份方法:

Linux程序宕掉后如何通过gdb查看出错信息

我们在编写服务端程序的时候,由于多线程并且环境复杂,程序可能在不确定条件的情况下宕掉,还不好重新,这是我们如何获取程序的出错信息,一种方法通过打日志,有时候一些错误日志也不能体现出来,这时就用到我们的core dump文件了. 通常情况下coredmp包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等.可以理解为把程序工作的当前状态存储成一个文件.许多程序和操作系统出错时会自动生成一个core文件. 1 我们系统一般默认是吧core dump 关掉的,可以通过ulimit -c 查看如

【生产环境部署】部署项目到生产环境Linux下

以前自己写过一个开源的项目,没部署到线上环境,借此机会熟悉下线上部署的流程 1.Linux上安装数据库MySQL,创建一个数据库database 名 Mxonline 2.使用远程工具 Navicat Premium 登录Linux数据库上,并把本地已经跑好的数据库表同步传输到 Mxonline上 3.数据库传输好后,在Linux上搭建Python的虚拟环境 在Linux系统的opt目录创建Python虚拟环境,一般虚拟环境创建在opt目录不然会有权限问题 再将 本地开发的项目project 文

为laravel5.1生产环境linux从源代码安装PHP

laravel5.1正式发布,该版本号称是第一个LTS的版本,它对环境的要求也比较高,至少要PHP5.59以上. 现在网上找了很久,只能自己从头安装新版本的PHP yum install libmcrypt libmcrypt-devel   注意需要安装这些lib wget http://cn2.php.net/get/php-5.6.10.tar.bz2/from/this/mirror 获取PHP代码 tar xvfj PHP5.6.tar.bz2 cd ext/mcrypt 到mcryp

生产环境中使用脚本实现tomcat start|status|stop|restart

一.在实际生产环境中tomcat启动是在bin目录下采用自带脚本startup.sh启动:使用shutdown.sh关闭.如下图: 再如果对于新手来讲在不知道路径情况下重启是一件头痛的事情(注意没有reload,所以重启只能shutdown.sh在startup.sh):而且这里还有一个坑等着: 什么坑呢?   如图: tomcat服务是启动成功了的.那么我想停止服务用shutdown.sh,会出现什么呢? 进程还在而且成为了僵尸进程,万恶啊?居然关不了,终极方法kill -9 进程号.试试?