簡介與優點
使用該腳本能自行判斷系統記憶體使用情況是否超出設定百分比
能在超出預警值時執行重啟程式的操作
能記錄重啟程序,并將具體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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/93343.html
標籤:Linux
上一篇:認識Linux
下一篇:linux行程與top命令
