使用該腳本能自行判斷系統記憶體使用情況是否超出設定百分比 能在超出預警值時執行重啟程式的操作 能記錄重啟過程,並將具體LOG郵件發送給指定收信人 可以設定Crontab排程,達成每隔一段時間運行一次 ...
簡介與優點
使用該腳本能自行判斷系統記憶體使用情況是否超出設定百分比
能在超出預警值時執行重啟程式的操作
能記錄重啟過程,並將具體LOG郵件發送給指定收信人
可以設定Crontab排程,達成每隔一段時間運行一次
準備工作
開啟郵箱的SMTP功能
這一步博主不會截圖做傻瓜教程,但每一步都不會漏,看不懂的小伙伴可以百度找個有圖教程。以QQ郵箱為例,進入設置->常規->POP3/IMAP/SMTP··->IMAP/SMTP服務,點擊開啟,會生成一個授權碼,把這個授權碼保存下來備用
修改mail.rc配置文件
輸入以下命令編輯mail.rc文件
vim /etc/mail.rc
在文件末尾追加以下配置內容
set [email protected] #這裡設定發信人的郵箱
set smtp=smtp.qq.com #這裡設定QQ的SMTP伺服器,其他郵箱可以參考百度
set [email protected] #這裡設定用戶名
set smtp-auth-password=sahflkhsaffshaf #這裡設定你上一步保存的授權碼
set smtp-auth=login #這裡設為login
#下麵是SSL加密相關的配置
#set smtp-use-starttls 這裡是不需要配置的,很多地方沒說明,配置了反而會驗證失敗,所以我註釋掉;
set ssl-verify=ignore
set nss-config-dir=/root/.certs
測試郵件是否成功發送
使用以下命令測試郵件是否成功發送,郵箱填你自己的,如果報錯請直接百度報錯部分解決。
echo "測試郵件正文部分"|mail -s "測試郵件標題部分" [email protected]
MemMonitor.sh
下載地址以下是腳本文件部分,請根據自己的實際情況修改。
#!/bin/bash
# Powered By heicaijun
# 2020/04/27
######################################################
# 以下為配置部分
##############
# 設置的告警值為50%(即使用超過50%的時候告警)。
mem_warn=0.50
# log記錄位置,每天記錄在一個log上
DATETIME=$(date -d "today" +"%Y-%m-%d")
log_dir="/home/p4fdc/PeakPerformance/FWlog/MemHistory_${DATETIME}.log"
mail_temp=/home/p4fdc/PeakPerformance/MemMonitor.log
[email protected]
#####################################################
# 該函數是啟動java程式的函數
function startFW(){
startResult=`/home/p4fdc/PeakPerformance/start${fwid}.sh`
#將release memory OK !記錄到log日誌中
DATA4="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 重啟程式成功,詳細LOG如下:\n[stop運行結果為:] ${stopResult};\n[start運行結果為:] ${startResult}"
echo -e "${DATA4}" >> ${log_dir}
echo "--->第${restartTime}次釋放記憶體完成 ! " >> ${log_dir}
}
# 該函數是發送郵件的函數
function sendMail(){
# 將需要發送的內容記錄在mailTemp的緩存Log中
echo -e "${DATA1}\n${DATA2}\n${DATA4}" >> ${mail_temp}
# 將需要發送的內容輸出到正文,並將之前緩存的Log以附件的形式發送給收信人,-a後接的是附件部分
echo -e "${DATA1}\n${DATA2}\n${DATA3}\n\n以上,請關註!" | mail -s "${mailTitle}" -a ${mail_temp} ${mail_addr}
# 發送完成後
rm -f ${mail_temp}
}
echo "============================" >> ${log_dir}
echo "Start MemMonitor.sh..." >> ${log_dir}
#系統分配的區總量
mem_total=`free -m | awk 'NR==2' | awk '{print $2}'`
#當前剩餘的大小
mem_free=`free -m | awk 'NR==2' | awk '{print $4}'`
#當前已使用的used大小
mem_used=`free -m | awk 'NR==2' | awk '{print $3}'`
#則計算當前剩餘used所占總量的百分比,用小數來表示,要在小數點前面補一個整數位0
mem_per=0`echo "scale=2;$mem_used/$mem_total" | bc`
DATA1="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 已使用記憶體百分比:${mem_per#*.}%,已使用:${mem_used}MB,總記憶體:${mem_total}MB"
echo -e $DATA1 >> ${log_dir}
#當前占用百分比與告警值進行比較(當大於告警值時會返回1,小於時會返回0 )
mem_now=`expr $mem_per \> $mem_warn`
echo "是否大於告警值[1大於,0小於]:${mem_now}" >> ${log_dir}
#如果當前使用超過50%(上面的返回值等於0),釋放記憶體
if (($mem_now == 1)); then
# 將郵件的標題設置為Alarm級別
mailTitle="[ALARM]T4 AP1 Out Of Memory"
echo -e "超過設定的報警值${mem_warn#*.}%..." >> ${log_dir}
#獲取目前占用記憶體最高的程式的DFID
fwid=`ps -eo pid,args --sort=-pmem |head -n 2|awk 'NR==2' | awk '{print $4}'`
fwid=${fwid#*_}
fwmem=`ps -eo pmem --sort=-pmem |head -n 2|awk 'NR==2'`
echo -e "${fwid}占用記憶體達${fwmem}%" >> ${log_dir}
DATA2="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 超過設定的報警值${mem_warn#*.}%,其中${fwid}占用記憶體達${fwmem}%,執行重啟${fwid}操作"
#執行重啟程式的操作
echo "開始執行重啟${fwid}操作..." >> ${log_dir}
stopResult=`/home/p4fdc/PeakPerformance/stop${fwid}.sh -f`
if [[ $stopResult =~ "Successfully" ]]; then
restartTime="一"
startFW
DATA3="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 重啟程式成功,詳細LOG請查看附件"
sendMail
else
# 以下多判斷了2次,其實一次基本夠了,因為配合kill -9基本不會出現殺不掉程式的問題。
stopResult=`/home/p4fdc/PeakPerformance/stop${fwid}.sh -f`
if [[ $stopResult =~ "Successfully" ]]; then
restartTime="二"
startFW
DATA3="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 重啟程式成功,詳細LOG請查看附件"
sendMail
else
stopResult=`/home/p4fdc/PeakPerformance/stop${fwid}.sh -f`
if [[ $stopResult =~ "Successfully" ]]; then
restartTime="三"
startFW
DATA3="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 重啟程式成功,詳細LOG請查看附件"
sendMail
else
startResult=`/home/p4fdc/PeakPerformance/start${fwid}.sh`
DATA4="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 重啟程式失敗,詳細LOG如下\n[stop運行結果為:] ${stopResult};\n[start運行結果為:] ${startResult}"
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!! " >> ${log_dir}
echo -e "${DATA4}" >> ${log_dir}
echo "--->三次嘗試釋放記憶體失敗,請手動檢查 ! " >> ${log_dir}
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!! " >> ${log_dir}
mailTitle="[ERROR]T4 AP1 Out Of Memory"
DATA3="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 三次嘗試釋放記憶體失敗,重啟程式失敗,詳細LOG請查看附件"
sendMail
fi
fi
fi
fi
echo "============================" >> ${log_dir}
設置Crontab排程
在設定Crontab排程的時候一定要註意,crontab預設不會載入環境變數,所以在運行java程式的時候,會出現找不到環境變數的問題。所以需要在啟動腳本前調用./etc/profile;,另外,由於排程是預設在user目錄下運行的,所以當你的腳本出現相對路徑的時候可能會出錯,所以建議加個cd /腳本目錄/腳本.sh;
以下為完整過程
- 輸入以下命令設置排程
crontab -e
- 在文件末尾追加以下排程
# 以下6段(用空格隔開的)分別代表 分 時 日 月 年 需要運行的代碼,*表示匹配所有時間段,30代表30分鐘,*/1代表能被1整除的小時。所以以下排程的完整意思是每小時的30分都運行一下MEMMonitor.sh,
30 */1 * * * ./etc/profile;cd /home/p4fdc/PeakPerformance/;/home/p4fdc/PeakPerformance/MemMonitor.sh > /dev/null