linux:记录一次 处理tomcat启动卡死无报错现象的曲折过程

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

一、环境

系统:CentOS 5.5

tomcat 6.0

jdk1.6

二、问题现象

    我们公司近期请人做的某个项目的一期要完成了,因对方负责java开发的工程师都不懂linux,而且也没有专职的linux工程师,最后的最后就是只能我来部署了,刚开始也没觉得会有多麻烦,按以往的套路来就好了嘛,好吧,先把项目在我本地环境(windows)跑一下,然而......

........(省略因开发环境不一样造成的揪心过程,还有对方代码的各种坑,然而我还拿不到源文件..)

一翻折腾,终于在本地运行起来了,谢天谢地,感觉黎明马上到来了,走起!上服务器...what?

    好吧!我承认,上面都是废话,请允许我发泄一下,好了,进入正题。

    是的,上传服务器之后,曲折之路才刚刚开始,因为当我启动tomcat的时候,它竟然启动一半就不动了,你这是什么意思,好歹给我报个错?(问题贴出来)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
信息: Using a shared selector  for  servlet write/read
2016 - 9 - 11  11 : 41 : 31  org.apache.coyote.http11.Http11NioProtocol init
信息: Initializing Coyote HTTP/ 1.1  on http- 8484
2016 - 9 - 11  11 : 41 : 31  org.apache.catalina.startup.Catalina load
信息: Initialization processed in  549  ms
2016 - 9 - 11  11 : 41 : 32  org.apache.catalina.core.StandardService start
信息: Starting service Catalina
2016 - 9 - 11  11 : 41 : 32  org.apache.catalina.core.StandardEngine start
信息: Starting Servlet Engine: Apache Tomcat/ 6.0 . 32
2016 - 9 - 11  11 : 41 : 32  org.apache.catalina.startup.HostConfig deployDirectory
信息: Deploying web application directory ROOT
clazz --->  class  com.fenxiao.user.entity.User
clazz --->  class  com.fenxiao.card.entity.Bankcard
clazz --->  class  com.fenxiao.pay.entity.PayRecord
clazz --->  class  com.fenxiao.present.entity.PresentRecord
clazz --->  class  com.fenxiao.task.entity.TaskImg
clazz --->  class  com.fenxiao.task.entity.TaskScreenshot
clazz --->  class  com.fenxiao.mytask.entity.UserTask

    到这里就再也没有然后了...


三、处理


    第一直觉,看不到问题那就只能猜测可能性了。(最后证明这种做法实在...不太好)


    思路1:难道还是软件版本的问题?

    可是代码经过微调,在window系统(win10)上同样的软件版本,已经成功运行了呀!没招了,升级环境吧,换了台有jdk1.8的服务器,然后把tomcat升级到了7.0 。重新运行...然后...才不会这么顺利呢! 然后在本地windows系统也整了个jdk1.8和tomcat7.0作为对比,结果当然是它在windows上依然畅快着呢!真想一巴掌拍死你...


    思路2:总不能是我的系统不行吧?

    开什么玩笑!我这系统跑了几年的java服务了,你怀疑我?好吧,虽然版本有点低了,但...算了,不考虑这方面的问题,你还要我升级系统不成?虽然tomcat启动日志也有一项提示我去安装某某,但我知道那既不是警告也不是错误,不太可能是造成启动不了的原因。可是,怎么办呢,问题出在哪了?


    思路3:既然环境没问题,那一点点排查代码吧,排除法...(磨人啊~)

    最后在各种文件删除...重启,部分代码删除...重启... 我也记不清大概尝试了多少次,就这么整天整天的尝试... 焦虑、抓狂、无助... 最后的最后我也只是得到一个结论,只要web.xml文件中出现struts2的配置文件就启动不了,一注释就起来了,这... 

    好吧,好像折腾出了有用的东西,刚开始还是有点小兴奋,应该调整下struts2的配置就好了,各种尝试...参考以前的配置...再尝试... (不管我怎么努力,你就在那里,不理不睬,好像你本就不存在!)

    

    思路4:奔溃啊!我百度都不知道搜什么呀,瞎找吧,“tomcat启动不了”“tomcat启动卡死”....

    又一通折腾,有说是数据库连接的问题,可那不至于卡死,最多过段时间抛错误了,而且我这个spring文件基本都顺利加载了(关键的配置文件我也已经把部分代码删除、重启...N遍了)。

    有人说是内存问题,启动的内存设置的不够么?内存溢出?有人说数据库连接池问题,或者配置文件没写好,死循环问题...让我看看你占了多少内存,free -m ...

    超过500M!看看其他tomcat也就不到200M,好像有点那意思,不过也还好啊,设置大点试试,研究了一翻相关配置

    http://wujt.iteye.com/blog/1699597

    http://blog.chinaunix.net/uid-26863299-id-3559878.html

    我尽量大的设置,它居然占用1个G,这...我觉得你有问题...代码写的不好,但到底是哪个地方的问题呢?啊~啊~好像又绕回来了,哪个地方写的有问题??!

    好吧,还是在tomcat/bin/catalina.sh 中留个正常点的配置

    JAVA_OPTS='-server -Xms1500m -Xmx1500m  -XX:MaxNewSize=512m  -XX:MaxPermSize=512m  -Djava.awt.headless=true'


    思路5:不行,我还是需要看到错误信息,让我看到更详细的日志,怎么看?(少年,你一开始就应该这么想的~~)

    有人说修改tomcat配置,有人说用log4j,还有人说...研究一翻吧。

    http://blog.csdn.net/senssic/article/details/46225841

    http://blog.chinaunix.net/uid-22816738-id-3511411.html

    好吧,动手开干,打开项目文件,what? 你已经配置log4j了?打开看看...妹的,怎么都注释了,怪不得就这点日志,统统解开注释(当然,最后发现其实只需要改一个单词就好了,那已经是察觉不对劲,又补了补理论知识之后发生的事了)

    http://blog.csdn.net/u012422446/article/details/51199724

    好吧,就是改它了,log4j.rootLogger=debug, stdout (把之前的error 改成了 debug) 

    本地、服务器都跑了一翻,我来好好比较,都有条烦人的定时任务执行日志一直重复打印,刚开始还以为你是死循环呢...尽管后来证明你是清白的。

    服务器依然没启动成功,不过,你大概逃不出我的手掌心了吧,只是打印了这么多日志,也没一个是报错呀~(少年,如果有报错,log4j早就给你看了),好吧,我承认!

    我再看看...

    本地一路执行到成功启动,可服务器运行到这里之后,就...只有那条定时任务日志在重复了..

1
2
20 : 05 : 53 , 133  DEBUG XmlConfigurationProvider: 57  - Loading action configurations from: struts-plugin.xml
20 : 05 : 53 , 133  DEBUG FileManager: 57  - Creating revision  for  URL: jar:file:/usr/local/tomcat3/webapps/FenXiao/WEB-INF/lib/struts2-json-plugin- 2.3 . 1.2 .jar!/struts-plugin.xml

    再看看人家本地执行的...分明是接着加载struts2的配置文件,怪不得你没启动起来,敢情是你没找到你要的文件,还那么执着...不肯退出...不报错...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
20 : 04 : 39 , 041  DEBUG FileManager: 57  - Creating revision  for  URL: jar:file:/F:/Software-test/tomcat7( 32 - 64 )/webapps/FenXiao/WEB-INF/lib/struts2-spring-plugin- 2.3 . 7 .jar!/struts-plugin.xml
20 : 04 : 39 , 047  DEBUG XmlConfigurationProvider: 57  - Loaded action configuration from: struts-plugin.xml
20 : 04 : 39 , 048   INFO XmlConfigurationProvider: 31  - Parsing configuration file [struts-plugin.xml]
20 : 04 : 39 , 053  DEBUG XmlConfigurationProvider: 57  - Loaded type:com.opensymphony.xwork2.ObjectFactory name:spring impl:org.apache.struts2.spring.StrutsSpringObjectFactory
20 : 04 : 39 , 053  DEBUG XmlConfigurationProvider: 57  - Loading action configurations from: struts.xml
20 : 04 : 39 , 055  DEBUG FileManager: 57  - Creating revision  for  URL: file:/F:/Software-test/tomcat7( 32 - 64 )/webapps/FenXiao/WEB-INF/classes/struts.xml
20 : 04 : 39 , 082  DEBUG XmlConfigurationProvider: 57  - Loading action configurations from: user.xml
20 : 04 : 39 , 084  DEBUG FileManager: 57  - Creating revision  for  URL: file:/F:/Software-test/tomcat7( 32 - 64 )/webapps/FenXiao/WEB-INF/classes/user.xml
20 : 04 : 39 , 107  DEBUG XmlConfigurationProvider: 57  - Loaded action configuration from: user.xml
20 : 04 : 39 , 107  DEBUG XmlConfigurationProvider: 57  - Loading action configurations from: agent.xml
20 : 04 : 39 , 110  DEBUG FileManager: 57  - Creating revision  for  URL: file:/F:/Software-test/tomcat7( 32 - 64 )/webapps/FenXiao/WEB-INF/classes/agent.xml
20 : 04 : 39 , 115  DEBUG XmlConfigurationProvider: 57  - Loaded action configuration from: agent.xml
20 : 04 : 39 , 115  DEBUG XmlConfigurationProvider: 57  - Loading action configurations from: role.xml
20 : 04 : 39 , 116  DEBUG FileManager: 57  - Creating revision  for  URL: file:/F:/Software-test/tomcat7( 32 - 64 )/webapps/FenXiao/WEB-INF/classes/role.xml
20 : 04 : 39 , 121  DEBUG XmlConfigurationProvider: 57  - Loaded action configuration from: role.xml
20 : 04 : 39 , 121  DEBUG XmlConfigurationProvider: 57  - Loading action configurations from: admin.xml
20 : 04 : 39 , 123  DEBUG FileManager: 57  - Creating revision  for  URL: file:/F:/Software-test/tomcat7( 32 - 64 )/webapps/FenXiao/WEB-INF/classes/admin.xml
20 : 04 : 39 , 144  DEBUG XmlConfigurationProvider: 57  - Loaded action configuration from: admin.xml
20 : 04 : 39 , 144  DEBUG XmlConfigurationProvider: 57  - Loading action configurations from: adminRole.xml
20 : 04 : 39 , 147  DEBUG FileManager: 57  - Creating revision  for  URL: file:/F:/Software-test/tomcat7( 32 - 64 )/webapps/FenXiao/WEB-INF/classes/adminRole.xml
20 : 04 : 39 , 151  DEBUG XmlConfigurationProvider: 57  - Loaded action configuration from: adminRole.xml
20 : 04 : 39 , 151  DEBUG XmlConfigurationProvider: 57  - Loading action configurations from: kindeditor.xml
20 : 04 : 39 , 153  DEBUG FileManager: 57  - Creating revision  for  URL: file:/F:/Software-test/tomcat7( 32 - 64 )/webapps/FenXiao/WEB-INF/classes/kindeditor.xml

    往上看了看更多的日志,关于struts2除了加载了struts-plugin.xml文件,还加载了struts-default.xml 文件,不过struts-default.xml文件在本地和服务器都加载成功了。他们是干嘛用的?为什么struts-plugin.xml加载会卡死?都在百度搜一下...(要不咋办?)

1
2
3
4
5
6
7
8
20 : 04 : 38 , 364  DEBUG FileManager: 57  - Creating revision  for  URL: jar:file:/F:/Software-test/tomcat7( 32 - 64 )/webapps/FenXiao/WEB-INF/lib/struts2-core- 2.3 . 7 .jar!/struts- default .xml
20 : 04 : 38 , 785  DEBUG XmlConfigurationProvider: 57  - Loaded action configuration from: struts- default .xml
20 : 04 : 38 , 790   INFO XmlConfigurationProvider: 31  - Parsing configuration file [struts- default .xml]
20 : 04 : 38 , 798  DEBUG XmlConfigurationProvider: 57  - Loaded type: name:xwork impl:com.opensymphony.xwork2.ObjectFactory
20 : 04 : 38 , 802  DEBUG XmlConfigurationProvider: 57  - Loaded type:com.opensymphony.xwork2.ObjectFactory name:struts impl:org.apache.struts2.impl.StrutsObjectFactory
20 : 04 : 38 , 804  DEBUG XmlConfigurationProvider: 57  - Loaded type:com.opensymphony.xwork2.FileManager name:system impl:com.opensymphony.xwork2.util.fs.DefaultFileManager
20 : 04 : 38 , 809  DEBUG XmlConfigurationProvider: 57  - Loaded type:com.opensymphony.xwork2.FileManagerFactory name:xwork impl:com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory
20 : 04 : 38 , 809  DEBUG XmlConfigurationProvider: 57  - Loaded type:com.opensymphony.xwork2.FileManagerFactory name:struts impl:com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory

    搜了一圈,嗯~ 当然没看到同我一样的问题!(这...已经很习惯啦),不过倒是有一篇文章让我好好思考了一翻,其实就是决定继续蒙一把(咳~ 希望还是要有的,万一蒙对了呢!)

    http://blog.csdn.net/chexitianxia/article/details/6746345

    不过,jar包这么多,还是别人的项目,我可不能精确锁定到哪些jar包要处理,好吧,那我就看看struts开头的jar包吧,只找到了下图这三个。还有两带“plugin”字眼,看到他们我内心是复杂的...

wKioL1fZRW3BvfiBAAANudyG5zs156.png-wh_50

    然后呢,然后我也只能跟那些在服务器上正常运行的项目对比一下struts2的jar包有什么不一样?最后发现,也只是他们的版本都要比上图中jar包的版本高一点罢了。不过,你呀的!这个项目你用的spring和hibernate版本都比我高,为什么struts2的jar包版本反而比我低?必须升级!(通常这么做没什么坏处...是的吧。 咳~)

    我又看了看其他的jar包,当我看到spring那一大遍区域的时候,内心是凌乱的,这千奇百怪的名字,而且还有"test"字眼,并且有两!贴出来看看(咳~这有点跑题,纯粹是想吐个槽)。等等...这里还有个“struts”,就在“test”上面,我怎么觉得它跟上图中的某个jar包冲突呢,把它删了吧,正好我总感觉这个项目struts2和spring很不和谐,为什么?还是那个所谓直觉...(不过,后来事实证明不是它的错,没关系,我给你放回来就是,咳~)

wKioL1fZSmGw9ddXAAAqHx9Xv3I264.png-wh_50

    就这样,我把服务器的三个struts2的jar包升级,然后把那个spring的jar包删了,重启看看...what? 启动这么快,成功了?why?就因为struts2的包版本低了?还是那个spring的jar包冲突了?(是的,我当时内心是惊讶的,有点兴奋,有点迟钝,还...有点崩溃...因为处理这个问题,我被折腾了三天,这...)

    我是个认真的人,我从不错怪一个jar包,咳~ 我决定把那个spring的jar包放回去再试一下...结果...结果的结果就是我这个项目的问题啊,其实就只是struts2的jar包的版本实在有点低了,得治!起码要升级成三年前本服务器宠幸的版本~~! 


四、结语


    这...事情发展到这,我已经不知道该说点什么好...(只是,少年,如果你遇到类似的情况,记得从思路5开始,“请让我先看到更详细的数据...”)

    好吧,被一个问题折腾了三天,然后又用三个小时写了篇文章,嗯,就这样。

    现在是晚上21:43,该去吃饭了,下回可不能这样。不按时吃饭,是不听妈妈话的表现,明天可是中秋节!啥?月饼吗?那是明天吃的...










本文转自 艺晨光 51CTO博客,原文链接:http://blog.51cto.com/ycgit/1852863,如需转载请自行联系原作者
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4月前
|
存储 监控 安全
在Linux中,⼀个EXT3的文件分区,当使用touch test.file命令创建⼀个新文件时报错,报错的信息是提示磁盘已满,但是采用df -h命令查看磁盘大小时,只使用了,60%的磁盘空间,为什么会出现这个情况?
在Linux中,⼀个EXT3的文件分区,当使用touch test.file命令创建⼀个新文件时报错,报错的信息是提示磁盘已满,但是采用df -h命令查看磁盘大小时,只使用了,60%的磁盘空间,为什么会出现这个情况?
|
29天前
|
Linux 数据库
Linux中第一次使用locate命令报错?????
在Linux CentOS7系统中,使用`locate`命令时出现“command not found”错误,原因是缺少`mlocate`包。解决方法是通过`yum install mlocate -y`或`apt-get install mlocate`安装该包,并执行`updatedb`更新数据库以解决后续的“can not stat”错误。
34 9
|
2月前
|
Ubuntu Linux Windows
linux 挂载硬盘报错 "mount: unknown filesystem type 'ntfs'"
【10月更文挑战第7天】在Linux系统中挂载硬盘时遇到“mount: unknown filesystem type 'ntfs'”错误,是因为Linux默认可能不支持NTFS文件系统。本文提供了解决方案:安装NTFS-3G软件包以支持NTFS,并检查内核是否已加载NTFS模块。对于Ubuntu/Debian系统,可使用`sudo apt-get install ntfs-3g`命令;对于CentOS/RHEL系统,则需先安装EPEL仓库再安装NTFS-3G。此外,还需确认硬盘设备名正确无误,并创建合适的挂载点目录。
704 2
|
3月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
51 5
|
3月前
|
Linux 编译器 开发工具
快速在linux上配置python3.x的环境以及可能报错的解决方案(python其它版本可同样方式安装)
这篇文章介绍了在Linux系统上配置Python 3.x环境的步骤,包括安装系统依赖、下载和解压Python源码、编译安装、修改环境变量,以及常见安装错误的解决方案。
320 1
|
4月前
|
应用服务中间件 Linux 网络安全
【Azure 应用服务】App Service for Linux 环境中为Tomcat页面修改默认的Azure 404页面
【Azure 应用服务】App Service for Linux 环境中为Tomcat页面修改默认的Azure 404页面
|
4月前
|
关系型数据库 Java MySQL
Linux安装JDK1.8 & tomcat & MariaDB(MySQL删减版)
本教程提供了在Linux环境下安装JDK1.8、Tomcat和MariaDB的详细步骤。这三个组件的组合为Java Web开发和部署提供了一个强大的基础。通过遵循这些简单的指导步骤,您可以轻松建立起一个稳定、高效的开发和部署环境。希望这个指导对您的开发工作有所帮助。
248 8
|
4月前
|
网络协议 安全 应用服务中间件
在Linux中,Tomcat8005、8009、8080三个端口的含义?
在Linux中,Tomcat8005、8009、8080三个端口的含义?
|
4月前
|
缓存 Java 应用服务中间件
在Linux中,Tomcat和Resin有什么区别,工作中怎么选择?
在Linux中,Tomcat和Resin有什么区别,工作中怎么选择?
|
5月前
|
应用服务中间件 Linux 网络安全