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

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

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

2015-3-1616:24:41org.apache.coyote.http11.Http11NioProtocolpause信息:PausingCoyoteHTTP/1.1onhttp-88**2015-3-1616:24:42org.apache.catalina.core.StandardServicestop信息:StoppingserviceCatalina2015-3-1616:24:42org.apache.catalina.loader.WebappClassLoaderclearReferencesJdbc

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

#!/bin/sh#auther:gushao#date:2014-12-23#aim:tomcatrestarttomcat_home=/home/resin/tomcattomcat_pid=`ps-ef|grepjava|grep$tomcat_home|grep-v'grep'|awk'{print$2}'`remove_log(){test-d$tomcat_home/logs/catalina||mkdir$tomcat_home/logs/catalinamv$tomcat_home/logs/catalina2*$tomcat_home/logs/catalinamv$tomcat_home/logs/catalina.2*$tomcat_home/logs/catalinatest-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.outisnotexist"#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.logisnotexist"case$1instop)if[-z$tomcat_pid];thenremove_logecho"tomcat已经是停止状态"exitkill-9$tomcat_pidremove_logstart)if[-z$tomcat_pid];then$tomcat_home/bin/catalina.shstarttail-f$tomcat_home/logs/catalina.outkill-9$tomcat_pidsleep6remove_log$tomcat_home/bin/catalina.shstarttail-f$tomcat_home/logs/catalina.outrestart)if[-z$tomcat_pid];thenremove_logkill-9$tomcat_pidsleep6remove_log$tomcat_home/bin/catalina.shstarttail-f$tomcat_home/logs/catalina.outecho"你的输入有误"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:tomcatrestarttomcat_home=/home/resin/tomcattomcat_pid=`ps-ef|grepjava|grep$tomcat_home|grep-v'grep'|awk'{print$2}'`remove_log(){test-d$tomcat_home/logs/catalina||mkdir$tomcat_home/logs/catalinamv$tomcat_home/logs/catalina2*$tomcat_home/logs/catalinamv$tomcat_home/logs/catalina.2*$tomcat_home/logs/catalinatest-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.outisnotexist"#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.logisnotexist"case$1instop)if[-z$tomcat_pid];thenremove_logecho"tomcat已经是停止状态"exitkill-9$tomcat_pidremove_logstart)if[-z$tomcat_pid];then$tomcat_home/bin/catalina.shstart tail-f$tomcat_home/logs/catalina.outkill-9$tomcat_pidsleep6remove_log$tomcat_home/bin/catalina.shstartrestart)if[-z$tomcat_pid];thenremove_logkill-9$tomcat_pidsleep6remove_log$tomcat_home/bin/catalina.shstart echo"你的输入有误"exit0

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

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

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

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

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

补充:

受sopato朋友的启发我,在关于nohup的文章发现个有趣的现象,和我此文章出现的问题类似:

在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 在程序结尾来让程序自动运行。比如我们要运行mysql在后台: /usr/local/mysql/bin/mysqld_safe –user=mysql 。可是有很多程序并不想mysqld一样,这样我们就需要nohup命令,怎样使用nohup命令呢?这里讲解nohup命令的一些用法。

nohup /root/start.sh

在shell中回车后提示:

[~]$ appending output to nohup.out

原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。

但是有时候在这一步会有问题,当把终端关闭后,进程会自动被关闭,察看nohup.out可以看到在关闭终端瞬间服务自动关闭。

咨询红旗Linux工程师后,他也不得其解,在我的终端上执行后,他启动的进程竟然在关闭终端后依然运行。

在第二遍给我演示时,我才发现我和他操作终端时的一个细节不同:他是在当shell中提示了nohup成功后还需要按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端;而我是每次在nohup执行成功后直接点关闭程序按钮关闭终端.。所以这时候会断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown。

这个细节有人和我一样没注意到,所以在这儿记录一下了。

此文章链接地址为:

http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051136.html

人的不幸缘于欲望,所以知足者长乐。

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

相关文章:

你感兴趣的文章:

标签云: