linux:記錄一次 處理tomcat啓動卡死無報錯現象的曲折過程

一、環境

系統:CentOS 5.5

tomcat 6.0

jdk1.6

二、問題現象

    我們公司近期請人做的某個項目的一期要完成了,因對方負責java開發的工程師都不懂linux,而且也沒有專職的linux工程師,最後的最後就是隻能我來部署了,剛開始也沒覺得會有多麻煩,按以往的套路來就好了嘛,好吧,先把項目在我本地環境(windows)跑一下,然而......

........(省略因開發環境不一樣造成的揪心過程,還有對方代碼的各種坑,然而我還拿不到源文件..)

一翻折騰,終於在本地運行起來了,謝天謝地,感覺黎明馬上到來了,走起!上服務器...what?

    好吧!我承認,上面都是廢話,請允許我發泄一下,好了,進入正題。

    是的,上傳服務器之後,曲折之路纔剛剛開始,因爲當我啓動tomcat的時候,它竟然啓動一半就不動了,你這是什麼意思,好歹給我報個錯?(問題貼出來)

信息: 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早就給你看了),好吧,我承認!

    我再看看...

    本地一路執行到成功啓動,可服務器運行到這裏之後,就...只有那條定時任務日誌在重複了..

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的配置文件,怪不得你沒啓動起來,敢情是你沒找到你要的文件,還那麼執着...不肯退出...不報錯...

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加載會卡死?都在百度搜一下...(要不咋辦?)

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,該去吃飯了,下回可不能這樣。不按時吃飯,是不聽媽媽話的表現,明天可是中秋節!啥?月餅嗎?那是明天吃的...

    

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章