Linux服務(wù)器中由于內(nèi)存不足導(dǎo)致tomcat自動(dòng)關(guān)閉解決方案

服務(wù)器環(huán)境:

? 騰訊云1核2G

? 操作系統(tǒng):CentOS7

最近將項(xiàng)目部署到服務(wù)器后發(fā)現(xiàn)tomcat總是過(guò)一段時(shí)間會(huì)自動(dòng)關(guān)掉。

1.查找原因

查看系統(tǒng)日志

cat /var/log/kern.log

發(fā)現(xiàn)如下內(nèi)容:

Oct 23 06:43:35 localhost kernel: [30799661.517422] Out of memory: Kill process 3272 (java) score 198 or sacrifice child
Oct 23 06:43:35 localhost kernel: [30799661.520502] Killed process 3272 (java) total-vm:2543564kB, anon-rss:392108kB, file-rss:0kB

2. 原因分析

原因分析:linux會(huì)定時(shí)檢查系統(tǒng)內(nèi)存大小,發(fā)現(xiàn)剩余內(nèi)存過(guò)小時(shí)會(huì)自動(dòng)優(yōu)先清理占用內(nèi)存較大的進(jìn)程,因此tomcat進(jìn)程經(jīng)常會(huì)被系統(tǒng)清除掉

3.解決方法

  1. 最簡(jiǎn)單的方法就是直接對(duì)云服務(wù)器內(nèi)存擴(kuò)容,一勞永逸
  2. 另一種方法就是設(shè)置一個(gè)定時(shí)任務(wù)執(zhí)行tomcat監(jiān)控腳本,每隔一段時(shí)間定時(shí)檢查tomcat進(jìn)程運(yùn)行狀態(tài),若檢查到進(jìn)程不存在,則自動(dòng)重啟tomcat

4.方法2步驟

(1)創(chuàng)建腳本文件tomcatMonitor.sh

# 設(shè)置java環(huán)境變量,不設(shè)置的話(huà)運(yùn)行startup.sh會(huì)報(bào)錯(cuò)
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/java/jdk/bin
JAVA_HOME=/usr/local/java/jdk
CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin

# 獲取tomcat進(jìn)程ID(其中[grep -w 'tomcat']代碼中的tomcat需要替換為你的tomcat文件夾名) 例如我的tomcat目錄為/home/ubuntu/tomcat9
TomcatID=$(ps -ef |grep tomcat |grep -w 'tomcat9'|grep -v 'grep'|awk '{print $2}')

# tomcat啟動(dòng)程序(這里注意tomcat實(shí)際安裝的路徑)
StartTomcat=/home/ubuntu/tomcat9/bin/startup.sh
TomcatCache=/home/ubuntu/tomcat9/work

#定義要監(jiān)控的頁(yè)面地址
WebUrl=http://localhost:8080

#日志輸出
GetPageInfo=/home/ubuntu/TomcatMonitor.Info
TomcatMonitorLog=/home/ubuntu/TomcatMonitor.log
Monitor()
{
    echo "[info]開(kāi)始監(jiān)控tomcat...[ $(date +'%F %H:%M:%S') ]"

    if [ $TomcatID ];then #這里判斷Tomcat進(jìn)程是否存在
        echo "[info]當(dāng)前tomcat進(jìn)程ID為:$TomcatID,繼續(xù)檢測(cè)頁(yè)面..."
        # 檢測(cè)是否啟動(dòng)成功(成功的話(huà)頁(yè)面會(huì)返回狀態(tài)"200")
        TomcatServiceCode=$(curl -s -o $GetPageInfo -m 10 --connect-timeout 10 $WebUrl -w %{http_code})
        # 這里檢測(cè)狀態(tài)碼為302是因?yàn)樽约旱捻?xiàng)目訪(fǎng)問(wèn)首頁(yè)會(huì)重定向,所以狀態(tài)碼為302
        if [ $TomcatServiceCode -eq 302 ];then
            echo "[info]頁(yè)面返回碼為$TomcatServiceCode,tomcat啟動(dòng)成功,測(cè)試頁(yè)面正常"
        else
            echo "[error]tomcat頁(yè)面出錯(cuò),請(qǐng)注意...狀態(tài)碼為$TomcatServiceCode,錯(cuò)誤日志已輸出到$GetPageInfo"
            echo "[error]頁(yè)面訪(fǎng)問(wèn)出錯(cuò),開(kāi)始重啟tomcat"
            kill -9 $TomcatID # 殺掉原tomcat進(jìn)程
            sleep 3
            rm -rf $TomcatCache # 清理tomcat緩存
            $StartTomcat
        fi
    else    
        echo "[error]tomcat進(jìn)程不存在!tomcat開(kāi)始自動(dòng)重啟..."
        echo "[info]$StartTomcat,請(qǐng)稍候..."
        rm -rf $TomcatCache
        # 啟動(dòng)tomcat
        $StartTomcat
    fi
    echo "--------------------------"
}
# 輸出到日志文件
Monitor>>$TomcatMonitorLog

(2)對(duì)腳本文件授權(quán)

chmod 777 tomcatMonitor.sh

(3)將腳本文件加入到定時(shí)任務(wù)中

# 編輯定時(shí)任務(wù)
crontab -e

添加如下內(nèi)容

#  五個(gè)*分別對(duì)應(yīng)
# *       *       *      *      *        command
# minute   hour    day   month   week    command
# 全為*表示每分鐘執(zhí)行一次
* * * * * /home/ubuntu/tomcatMonitor.sh

保存并退出

(如果出現(xiàn)以下內(nèi)容,則輸入3進(jìn)入vim編輯模式再進(jìn)行編輯)

選擇編輯器.png

具體crontab命令參考:https://www.cnblogs.com/zoulongbin/p/6187238.html

(4)查看任務(wù)執(zhí)行情況

#查看定時(shí)任務(wù)
crontab -l
# 查看自定義日志文件
tailf /home/ubuntu/TomcatMonitor.log

輸出如下內(nèi)容表示定時(shí)任務(wù)正在執(zhí)行


tomcat成功.png
啟動(dòng).png
失敗1.png

參考博客:

https://www.cnblogs.com/zoulongbin/p/6187238.html

https://blog.csdn.net/zhang41228/article/details/79860030

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容