Tomcat進程意外退出的問題分析
早上6點接到電話java服務器掛掉了,本能的立刻清醒起來查看服務器狀態,發現tomcat確實停止運行了,立刻的重啓了之後去找問題所在(ps:這個問題體現了集羣負載均衡是多麼重要,服務器幾乎崩潰一晚上)
錯誤排查思路:首先想到的是服務器是否負載導致tomcat閃退(stackoverflow/outofmemoryerror),hs_err_pid.log文件未生成,表明jvm正常運行,然後去查看tomcat日誌
此處顯示tomcat停止於02:53:00,而且無任何錯誤,tomcat是正常關閉的!!!看清楚這是正常關閉的,根本不存在負載退出的情況
本能想到怕是要被黑客爆ju了,查看了tomcat最後的訪問地址無異常
查看服務器負載情況(指系統,因爲使用的是阿里雲服務器,當然的有記錄崩潰時服務器的運行狀態)一切正常,無任何可疑地方,使用stat "命令地址" 查詢系統命令是否有修改過
例如:
未發現異常,繼續查詢遠程終端登錄情況last 命令查詢
登錄終端也是正常,都是本人自己的ip,試想好不好被linux終止了tomcat進程於是去查詢/var/log/message 日誌信息
未發現異常,緊接着去查詢/var/log/secure日誌文件
這次發現了有趣的事情,sshd關閉了遠程連接時間與tomcat進程終止時間完全吻合,定位了問題之後就方便多了,查詢了一些資料之後重現了tomcat進程“閃退”,總的來說是因爲發佈版本完成之後未關閉shell腳本,腳本還在掛着tailf查看日誌,電腦休眠之後sshd主動關閉了遠程連接,java進程仍屬於shell進程組裏的成員,收到SIGHUP
後退出,自己寫了個簡單的腳本重現了當時的情況。確定了問題就是這個原因。
如果我們在shell腳本里設置開啓作業控制的話,就不會讓tomcat進程退出了,總算是虛驚一場,是自己的原因導致tomcat進程結束,並不是黑客入侵~
總結:啓動完成之後需要關閉退出腳本,就不會出現sshd關閉遠程連接而使進程終止了,當然更好的辦法是在腳本中加入設置開啓作業控制(分開進程組)就不會出現這個問題啦~
每個人碰到的閃退問題可能不一致,但排查的思路還是值得學習的~
借鑑文章:http://ifeve.com/why-kill-2-cannot-stop-tomcat/
set -m