服務(wù)器環(huán)境:
? 騰訊云1核2G
? 操作系統(tǒng):CentOS7
最近將項目部署到服務(wù)器后發(fā)現(xiàn)tomcat總是過一段時間會自動關(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會定時檢查系統(tǒng)內(nèi)存大小,發(fā)現(xiàn)剩余內(nèi)存過小時會自動優(yōu)先清理占用內(nèi)存較大的進(jìn)程起便,因此tomcat進(jìn)程經(jīng)常會被系統(tǒng)清除掉
3.解決方法
- 最簡單的方法就是直接對云服務(wù)器內(nèi)存擴(kuò)容棚贾,一勞永逸
- 另一種方法就是設(shè)置一個定時任務(wù)執(zhí)行tomcat監(jiān)控腳本,每隔一段時間定時檢查tomcat進(jìn)程運(yùn)行狀態(tài)榆综,若檢查到進(jìn)程不存在慎颗,則自動重啟tomcat
4.方法2步驟
(1)創(chuàng)建腳本文件tomcatMonitor.sh
# 設(shè)置java環(huán)境變量叼耙,不設(shè)置的話運(yùn)行startup.sh會報錯
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啟動程序(這里注意tomcat實際安裝的路徑)
StartTomcat=/home/ubuntu/tomcat9/bin/startup.sh
TomcatCache=/home/ubuntu/tomcat9/work
#定義要監(jiān)控的頁面地址
WebUrl=http://localhost:8080
#日志輸出
GetPageInfo=/home/ubuntu/TomcatMonitor.Info
TomcatMonitorLog=/home/ubuntu/TomcatMonitor.log
Monitor()
{
echo "[info]開始監(jiān)控tomcat...[ $(date +'%F %H:%M:%S') ]"
if [ $TomcatID ];then #這里判斷Tomcat進(jìn)程是否存在
echo "[info]當(dāng)前tomcat進(jìn)程ID為:$TomcatID,繼續(xù)檢測頁面..."
# 檢測是否啟動成功(成功的話頁面會返回狀態(tài)"200")
TomcatServiceCode=$(curl -s -o $GetPageInfo -m 10 --connect-timeout 10 $WebUrl -w %{http_code})
# 這里檢測狀態(tài)碼為302是因為自己的項目訪問首頁會重定向鳞上,所以狀態(tài)碼為302
if [ $TomcatServiceCode -eq 302 ];then
echo "[info]頁面返回碼為$TomcatServiceCode借嗽,tomcat啟動成功,測試頁面正常"
else
echo "[error]tomcat頁面出錯判沟,請注意...狀態(tài)碼為$TomcatServiceCode耿芹,錯誤日志已輸出到$GetPageInfo"
echo "[error]頁面訪問出錯,開始重啟tomcat"
kill -9 $TomcatID # 殺掉原tomcat進(jìn)程
sleep 3
rm -rf $TomcatCache # 清理tomcat緩存
$StartTomcat
fi
else
echo "[error]tomcat進(jìn)程不存在!tomcat開始自動重啟..."
echo "[info]$StartTomcat挪哄,請稍候..."
rm -rf $TomcatCache
# 啟動tomcat
$StartTomcat
fi
echo "--------------------------"
}
# 輸出到日志文件
Monitor>>$TomcatMonitorLog
(2)對腳本文件授權(quán)
chmod 777 tomcatMonitor.sh
(3)將腳本文件加入到定時任務(wù)中
# 編輯定時任務(wù)
crontab -e
添加如下內(nèi)容
# 五個*分別對應(yīng)
# * * * * * command
# minute hour day month week command
# 全為*表示每分鐘執(zhí)行一次
* * * * * /home/ubuntu/tomcatMonitor.sh
保存并退出
(如果出現(xiàn)以下內(nèi)容吧秕,則輸入3進(jìn)入vim編輯模式再進(jìn)行編輯)
具體crontab命令參考:https://www.cnblogs.com/zoulongbin/p/6187238.html
(4)查看任務(wù)執(zhí)行情況
#查看定時任務(wù)
crontab -l
# 查看自定義日志文件
tailf /home/ubuntu/TomcatMonitor.log
輸出如下內(nèi)容表示定時任務(wù)正在執(zhí)行
參考博客: