背景:
有一次晚上下班,發完版,剛把電腦合上走到樓下,就接到報警,說是線上有一個tomcat進程不存在了,想着以為是誤報,但是還是回去看看了,發現線上確實是剛才發版的項目,進程不存在了,想了想,剛才測試已經通過了的,趕緊查看了下日志,看到如下報錯:
18-Jul-2018 19:51:14.064 信息 [Thread-9] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8007"] 18-Jul-2018 19:51:14.115 信息 [Thread-9] org.apache.catalina.core.StandardService.stopInternal Stopping service Catalina 18-Jul-2018 19:51:14.192 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [erpQposRest] registered the JDBC driver [com.alibaba.druid.proxy.DruidDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 18-Jul-2018 19:51:14.193 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [erpQposRest] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 18-Jul-2018 19:51:14.193 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [erpQposRest] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:64) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) java.lang.Thread.run(Thread.java:745) 18-Jul-2018 19:51:14.199 信息 [Thread-9] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8007"] 18-Jul-2018 19:51:14.201 信息 [Thread-9] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8007"]
趕緊根據關鍵字網上翻資料,找到問題所在,因為項目發版用的是shell腳本操作的,所有的項目啟動停止都在腳本完成。問題的最終原因是因為,由於有tailf catalina.out,是為了觀察項目的tomcat是否正常啟動,當時沒有對命令進行ctrl +c ,就直接關閉xshell所以控制台一直停留在tailf catalina.out界面。這樣直接關閉xshell窗口,會導致該tomcat進程被kill掉。
具體的為什么關閉xshell會kill掉tomcat進程,后面有時間再來研究。
總結:作為運維,凡事線上操作都要小心,不要忽略任何小問題,這樣才會保障線上穩定