溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何解決因信號量引發(fā)tomcat異常退出的問題

發(fā)布時間:2021-07-30 09:54:33 來源:億速云 閱讀:246 作者:小新 欄目:服務(wù)器

這篇文章主要介紹如何解決因信號量引發(fā)tomcat異常退出的問題,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

近期在玩大數(shù)據(jù)。有個朋友找過來,說他線上的tomcat會莫名其妙的退出,表示非??鄲溃埼?guī)涂纯?。每次他發(fā)現(xiàn)退出了,都通過騰訊云的WEB控制臺登錄,啟動tomcat。

本著助人為樂(shao kao hao chi)的精神,我連上去開始分析。首先肯定是看tomcat的日志,看看有沒有記錄到相關(guān)信息,是什么途徑退出的。

如何解決因信號量引發(fā)tomcat異常退出的問題如何解決因信號量引發(fā)tomcat異常退出的問題

從日志上看,tomcat收到了退出請求,并按照要求關(guān)閉容器。那么是否可以認(rèn)為是有人執(zhí)行了shutdown.sh呢?并不能。執(zhí)行了shutdown腳本的關(guān)閉日志是這樣的。

如何解決因信號量引發(fā)tomcat異常退出的問題

與其相關(guān)的tomcat源碼截圖如下。截圖左側(cè)有行號。

tomcat啟動時,設(shè)置await,等待關(guān)閉指令進(jìn)入。org\apache\catalina\startup\Bootstrap.java

如何解決因信號量引發(fā)tomcat異常退出的問題

如何解決因信號量引發(fā)tomcat異常退出的問題

catalinaDaemon的定義如下。

如何解決因信號量引發(fā)tomcat異常退出的問題

org\apache\catalina\startup\Catalina.java

如何解決因信號量引發(fā)tomcat異常退出的問題

如何解決因信號量引發(fā)tomcat異常退出的問題

如何解決因信號量引發(fā)tomcat異常退出的問題

如何解決因信號量引發(fā)tomcat異常退出的問題

具體實例化時,會將接口Server的實例指向StandardServer。類路徑如下。

org\apache\catalina\Server.java

org\apache\catalina\core\StandardServer.java

而StandServer中的輸出相關(guān)日志的源碼如下:

如何解決因信號量引發(fā)tomcat異常退出的問題

讀取的配置文件為org\apache\catalina\core\LocalStrings.properties

如何解決因信號量引發(fā)tomcat異常退出的問題

當(dāng)tomcat收到正經(jīng)的關(guān)閉指令時,會輸出此日志,說明是收到指令關(guān)閉容器。

正經(jīng)的指令關(guān)閉容器,相關(guān)代碼如下。

如何解決因信號量引發(fā)tomcat異常退出的問題

如何解決因信號量引發(fā)tomcat異常退出的問題

那么,現(xiàn)在的證據(jù)說明,這個tomcat不是通過SHUTDOWN報文關(guān)閉的。而且,從下圖來看,也頗能說明這個SHUTDOWN指令不是這么容易發(fā)成功的。

如何解決因信號量引發(fā)tomcat異常退出的問題

那么現(xiàn)在可能性最大的辦法就是通過KILL指令來操作。執(zhí)行bash腳本需要登錄機器,那么從wtmp、utmp查找一下這個時間點的登錄記錄呢?

如何解決因信號量引發(fā)tomcat異常退出的問題

如何解決因信號量引發(fā)tomcat異常退出的問題

下面是IPIP的結(jié)果。

如何解決因信號量引發(fā)tomcat異常退出的問題

換言之,23日早上tomcat異常退出的時候,有一個來自騰訊云的BGP機房的地址也巧合的斷開了會話。而我這個朋友的機器就放在騰訊云。有點奇怪是嗎?

繼續(xù)追查,連續(xù)追溯幾天的tomcat日志,比對utmp、wtmp結(jié)果,再比對IPIP結(jié)果,都是如此。來自騰訊云BGP機房的會話斷開,tomcat同一時間點退出。精確到秒級。連續(xù)多天出現(xiàn)很多次,說明tomcat退出和WEB會話退出是具備因果關(guān)系的。

經(jīng)過詢問,朋友確認(rèn)他是習(xí)慣于使用WEB控制臺的方式登錄服務(wù)器,啟動了tomcat以后就丟在一邊,開始調(diào)試接口了。那么有什么可能會導(dǎo)致這樣的因果關(guān)系出現(xiàn)?這就要說到Linux系統(tǒng)的一個歷史悠久的進(jìn)程間通信的機制——信號量。

具體信號量是什么,請自行查詢相關(guān)資料了解學(xué)習(xí)。針對本次問題,可以簡單的理解為進(jìn)程間通訊的一種機制。

進(jìn)程A需要進(jìn)程B做點事,而進(jìn)程間的內(nèi)存區(qū)域某種意義上說是互不可見的。這個時候就需要通過信號量來完成。進(jìn)程A可以按照預(yù)先定義的信號量規(guī)范向進(jìn)程B發(fā)出信號量,當(dāng)進(jìn)程B收到后,根據(jù)具體信號量的值決定處理邏輯。具體信號量清單,可以在命令行通過如下命令查詢。命令中均為字母,沒有數(shù)字1。

如何解決因信號量引發(fā)tomcat異常退出的問題

這其中最常見的就是9,SIGKILL。當(dāng)進(jìn)程收到此信號量時,會被KILL掉。此信號量由操作系統(tǒng)處理,應(yīng)用不能處理。在vista之前的windows系統(tǒng)中,是有辦法滲透到內(nèi)核中的。此時可以攔截類似WM_CLOSE之類的消息,讓某個程序無法關(guān)閉。到了win7、win10時代,已經(jīng)不能使用此類技巧了。

此外,我們熟悉的CTRL + C操作,發(fā)出的是SIGINT。有些場景下,我們需要通知程序優(yōu)雅的退出,此時可以發(fā)出SIGQUIT,也就是kill -3。

那么WEB控制臺會話斷開,會發(fā)出什么信號量呢?我們來試試就知道了。Java雖然說不能操作系統(tǒng)底層,但是sun.misc包有驚喜哦。代碼如下。

如何解決因信號量引發(fā)tomcat異常退出的問題

如何解決因信號量引發(fā)tomcat異常退出的問題

如圖所示,這段代碼會在收到信號量時輸出線程名稱,信號量名稱,并翻譯成具體的數(shù)字。隨后,在main函數(shù)中,我“注冊”了HUP、INT、ABRT、TERM四種信號量。注冊四種是因為不清楚具體會發(fā)什么出來,索性有可能的都搞起來。

編譯,打包。此處有一個問題需要注意,由于信號量屬于操作系統(tǒng)底層機制,每個不同操作系統(tǒng)所支持的信號量是不同的,JVM中通過private static native int findSignal(String paramString)提供支持。native方法涉及具體VM實現(xiàn),不貼代碼了。不過很容易想到的是,windows和linux當(dāng)然不同。所以此處就要在上位機編寫,下位機調(diào)試了。windows底下運行報錯可不要慌張哦。

接下來的事情就簡單了。把程序上傳服務(wù)器,通過WEB控制臺登錄服務(wù)器,將執(zhí)行結(jié)果重定向到文本文件中,然后靜待控制臺超時。結(jié)果如下。

如何解決因信號量引發(fā)tomcat異常退出的問題

如何解決因信號量引發(fā)tomcat異常退出的問題

結(jié)果不用再分析了,WEB控制臺會在退出時發(fā)出SIGHUP,相當(dāng)于kill -1。而tomcat在收到SIGHUP會怎么操作呢?小伙伴們可以試試看kill -1 pid,再看看日志,就明白了。

解決方案其實也簡單。SIGHUP是HANG UP的意思,可以用nohup xx.sh &來徹底屏蔽SIGHUP和SIGINT。另外,經(jīng)過測試發(fā)現(xiàn),通過單擊SecureCRT的tab頁右側(cè)的×也可以觸發(fā)信號量,而直接logout或者點菜單上的紅叉則并不會觸發(fā)。

感興趣的小伙伴可以把這個程序擴(kuò)展一下,測測看。說不定你的異常退出問題也能迎刃而解呢。

以上是“如何解決因信號量引發(fā)tomcat異常退出的問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI