Linux伺服器記憶體監控—每小時檢查&超出發送郵件&重啟占用最高的Java程式

来源:https://www.cnblogs.com/heicaijun/archive/2020/04/27/12785448.html
-Advertisement-
Play Games

使用該腳本能自行判斷系統記憶體使用情況是否超出設定百分比 能在超出預警值時執行重啟程式的操作 能記錄重啟過程,並將具體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;
以下為完整過程

  1. 輸入以下命令設置排程
crontab -e
  1. 在文件末尾追加以下排程
# 以下6段(用空格隔開的)分別代表 分 時 日 月 年 需要運行的代碼,*表示匹配所有時間段,30代表30分鐘,*/1代表能被1整除的小時。所以以下排程的完整意思是每小時的30分都運行一下MEMMonitor.sh, 
30 */1 * * * ./etc/profile;cd /home/p4fdc/PeakPerformance/;/home/p4fdc/PeakPerformance/MemMonitor.sh > /dev/null

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、shell腳本介紹 (一)腳本案例及介紹: (二)shell腳本解釋器: 解釋器預設為bash,如果腳本中不標明解釋器,預設調用bash。 批量註釋方法1:ctrl+shift+v,游標向下移動,shitf+a,第一行前 ,esc。 批量註釋方法2:將要註釋的內容寫在下麵符號內::/dev/nu ...
  • 痞子衡最近在深耕i.MXRT1170這顆劃時代的MCU,已經寫了不少篇相關技術文章,涉及整體特點、Raw NAND啟動、FlexRAM模塊、ECC特性等,文章寫得越多越發覺得i.MXRT1170是座寶礦,值得大家去仔細探索。話不多說,咱們繼續挖礦吧,今天痞子衡為大家介紹i.MXRT1170雙核間互相... ...
  • 作為代理伺服器,在完成一次http事務的過程中,報文的流向是這樣的;首先用戶端的請求會到達haproxy,haproxy收到用戶的請求,對其進行拆包分析,然後根據用戶請求報文的某些首部的特征,然後模擬用戶的請求去請求對應後端server,此時haproxy就扮演著客戶端角色去請求後端伺服器;後端服... ...
  • SimpleHTTPServer + wget 如果線上可以直連線下的話,線上上使用wget訪問線下的文件伺服器; web的方法,比較靈活,使用完要儘快關閉這個服務; nginx + wget web的方法,比較靈活,使用完要儘快關閉這個服務; scp 如果是線下機器,想往線上機器傳輸,線上機器是拒 ...
  • 回到目錄 我們在前面的BJT直流分析章節,還講過一種“集電極反饋偏置”電路,它也是共射放大電路的一種。這種電路在集電極和基級之間增加了一個反饋電阻,分析難度有所增加,故這裡單獨用一小節進行分析。 1. 基本分析 下麵是一個基本的集電極反饋電路: 圖4-08.01 將上圖中的BJT晶體管替換成re等效 ...
  • Linux系統進程的5種狀態: R(代表當前正在為用戶提供服務的進程); A,sleeping(等待為用戶提供服務的進程); D(不可中斷,雖然當前是為客戶提供服務 但程式出現問題 不能夠中斷) Z,zombie(僵屍進程/僵死進程,當前沒有為客戶提供服務,並且他會一 直消耗你系統的資源) T(代表 ...
  • 文件功能 編輯 ├—WINDOWS │ ├—system32(存放Windows的系統文件和硬體驅動程式) │ │ ├—config(用戶配置信息和密碼信息) │ │ │ └—systemprofile(系統配置信息,用於恢復系統) │ │ ├—drivers(用來存放硬體驅動文件,不建議刪除) │ ...
  • node-gyp rebuildgyp ERR! configure error gyp ERR! stack Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/@vue/cli/node_modules/fse... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...