使用shell 指令碼對 Linux 系統程序的CPU使用率與記憶體資源進行監控
Shell 簡介
Shell 語言對於接觸 LINUX 的人來說都比較熟悉,它是系統的使用者介面,提供了使用者與核心進行互動操作的一種介面。它接收使用者輸入的命令並把它送入核心去執行。實際上 Shell 是一個命令直譯器,它解釋由使用者輸入的命令並且把它們送到核心。它沒有一般程式語言的“編譯 - 連結 - 執行”過程。不僅如此,Shell 有自己的程式語言用於對命令的編輯,它允許使用者編寫由 shell 命令組成的程式。Shell 程式語言具有普通程式語言的很多特點,比如它也有迴圈結構和分支控制結構等,用這種程式語言編寫的 Shell 程式與其他應用程式具有同樣的效果。當然,Shell 功能也是很強大的。
使用 Shell 對程序資源進行監控
檢查程序是否存在
在對程序進行監控時,我們一般需要得到該程序的 ID,程序 ID 是程序的唯一標識,但是有時可能在伺服器上不同使用者下執行著多個相同程序名的程序,下面的函式 GetPID 給出了獲取指定使用者下指定程序名的程序 ID 功能(目前只考慮這個使用者下啟動一個此程序名的程序),它有兩個引數為使用者名稱和程序名,它首先使用 ps 查詢程序資訊,同時通過 grep 過濾出需要的程序,最後通過 sed 和 awk 查詢需要程序的 ID 值(此函式可根據實際情況修改,比如需要過濾其它資訊等)。
清單 1. 對程序進行監控
function GetPID #User #Name { PsUser=$1 PsName=$2 pid=`ps -u $PsUser|grep $PsName|grep -v grep|grep -v vi|grep -v dbx\n |grep -v tail|grep -v start|grep -v stop |sed -n 1p |awk '{print $1}'` echo $pid } |
示例演示:
1)源程式(例如查詢使用者為 root,程序名為 CFTestApp 的程序 ID)
PID=`GetPID root CFTestApp` echo $PID |
2)結果輸出
11426 [[email protected] shell]$ |
3)結果分析
從上面的輸出可見:11426 為 root 使用者下的 CFTestApp 程式的程序 ID。
4)命令介紹
1. ps: 檢視系統中瞬間程序資訊。 |
有時有可能程序沒有啟動,下面的功能是檢查程序 ID 是否存在,如果此程序沒有執行輸出:
The process does not exist. # 檢查程序是否存在 if [ "-$PID" == "-" ] then { echo "The process does not exist." } fi |
檢測程序 CPU 利用率
在對應用服務進行維護時,我們經常遇到由於 CPU 過高導致業務阻塞,造成業務中斷的情況。CPU 過高可能由於業務量過負荷或者出現死迴圈等異常情況,通過指令碼對業務程序 CPU 進行時時監控,可以在 CPU 利用率異常時及時通知維護人員,便於維護人員及時分析,定位,以及避免業務中斷等。下面的函式可獲得指定程序 ID 的程序 CPU 利用率。它有一個引數為程序 ID,它首先使用 ps 查詢程序資訊,同時通過 grep -v 過濾掉 %CPU 行,最後通過 awk 查詢 CPU 利用百分比的整數部分(如果系統中有多個 CPU,CPU 利用率可以超過 100%)。
清單 2. 對業務程序 CPU 進行實時監控
function GetCpu { CpuValue=`ps -p $1 -o pcpu |grep -v CPU | awk '{print $1}' | awk - F. '{print $1}'` echo $CpuValue } |
下面的功能是通過上面的函式 GetCpu 獲得此程序的 CPU 利用率,然後通過條件語句判斷 CPU 利用率是否超過限制,如果超過 80%(可以根據實際情況進行調整),則輸出告警,否則輸出正常資訊。
清單 3. 判斷 CPU 利用率是否超過限制
function CheckCpu { PID=$1 cpu=`GetCpu $PID` if [ $cpu -gt 80 ] then { echo “The usage of cpu is larger than 80%” } else { echo “The usage of cpu is normal” } fi } |
示例演示:
1)源程式(假設上面已經查詢出 CFTestApp 的程序 ID 為 11426)
CheckCpu 11426 |
2)結果輸出
The usage of cpu is 75 The usage of cpu is normal [[email protected] shell]$ |
3)結果分析
從上面的輸出可見:CFTestApp 程式當前的 CPU 使用為 75%,是正常的,沒有超過 80% 的告警限制。
檢測程序記憶體使用量
在對應用服務進行維護時,也經常遇到由於記憶體使用過大導致程序崩潰,造成業務中斷的情況(例如 32 位程式可定址的最大記憶體空間為 4G,如果超出將申請記憶體失敗,同時實體記憶體也是有限的)。記憶體使用過高可能由於記憶體洩露,訊息堆積等情況,通過指令碼對業務程序記憶體使用量進行時時監控,可以在記憶體使用量異常時及時傳送告警(例如通過簡訊),便於維護人員及時處理。下面的函式可獲得指定程序 ID 的程序記憶體使用情況。它有一個引數為程序 ID,它首先使用 ps 查詢程序資訊,同時通過 grep -v 過濾掉 VSZ 行 , 然後通過除 1000 取以兆為單位的記憶體使用量。
清單 4. 對業務程序記憶體使用量進行監控
function GetMem { MEMUsage=`ps -o vsz -p $1|grep -v VSZ` (( MEMUsage /= 1000)) echo $MEMUsage } |
下面的功能是通過上面的函式 GetMem獲得此程序的記憶體使用,然後通過條件語句判斷記憶體使用是否超過限制,如果超過 1.6G(可以根據實際情況進行調整),則輸出告警,否則輸出正常資訊。
清單 5. 判斷記憶體使用是否超過限制
mem=`GetMem $PID` if [ $mem -gt 1600 ] then { echo “The usage of memory is larger than 1.6G” } else { echo “The usage of memory is normal” } fi |
示例演示:
1)源程式(假設上面已經查詢出 CFTestApp 的程序 ID 為 11426)
mem=`GetMem 11426` echo "The usage of memory is $mem M" if [ $mem -gt 1600 ] then { echo "The usage of memory is larger than 1.6G" } else { echo "The usage of memory is normal" } fi |
2)結果輸出
The usage of memory is 248 M The usage of memory is normal [[email protected] shell]$ |
3)結果分析
從上面的輸出可見:CFTestApp 程式當前的記憶體使用為 248M,是正常的,沒有超過 1.6G 的告警限制。
檢測程序控制代碼使用量
在對應用服務進行維護時,也經常遇到由於控制代碼使用 過量導致業務中斷的情況。每個平臺對程序的控制代碼使用都是有限的,例如在 Linux 平臺,我們可以使用 ulimit – n 命令(open files (-n) 1024)或者對 /etc/security/limits.conf 的內容進行檢視,得到程序控制代碼限制。控制代碼使用過高可能由於負載過高,控制代碼洩露等情況,通過指令碼對業務程序控制代碼使用量進行時時監控,可以在異常時及時傳送告警(例如通過簡訊),便於維護人員及時處理。下面的函式可獲得指定程序 ID 的程序控制代碼使用情況。它有一個引數為程序 ID,它首先使用 ls 輸出程序控制代碼資訊,然後通過 wc -l 統計輸出控制代碼個數。
function GetDes { DES=`ls /proc/$1/fd | wc -l` echo $DES } |
下面功能是通過上面的函式 GetDes獲得此程序的控制代碼使用量,然後通過條件語句判斷控制代碼使用是否超過限制,如果超過 900(可以根據實際情況進行調整)個,則輸出告警,否則輸出正常資訊。
des=` GetDes $PID` if [ $des -gt 900 ] then { echo “The number of des is larger than 900” } else { echo “The number of des is normal” } fi |
示例演示:
1)源程式(假設上面查詢出 CFTestApp 的程序 ID 為 11426)
des=`GetDes 11426` echo "The number of des is $des" if [ $des -gt 900 ] then { echo "The number of des is larger than 900" } else { echo "The number of des is normal" } fi |
2)結果輸出
The number of des is 528 The number of des is normal [[email protected] shell]$ |
3)結果分析
從上面的輸出可見:CFTestApp 程式當前的控制代碼使用為 528 個,是正常的,沒有超過 900 個的告警限制。
4)命令介紹
wc: 統計指定檔案中的位元組數、字數、行數 , 並將統計結果顯示輸出。 |
使用 Shell 對系統資源進行監控
檢視某個 TCP 或 UDP 埠是否在監聽
埠檢測是系統資源檢測經常遇到的,特別是在網路通訊情況下,埠狀態的檢測往往是很重要的。有時可能程序,CPU,記憶體等處於正常狀態,但是埠處於異常狀態,業務也是沒有正常執行。下面函式可判斷指定埠是否在監聽。它有一個引數為待檢測埠,它首先使用 netstat 輸出端口占用資訊,然後通過 grep, awk,wc 過濾輸出監聽 TCP 埠的個數,第二條語句為輸出 UDP 埠的監聽個數,如果 TCP 與 UDP 埠監聽都為 0,返回 0,否則返回 1.
清單 6. 埠檢測
function Listening { TCPListeningnum=`netstat -an | grep ":$1 " | \n awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l` UDPListeningnum=`netstat -an|grep ":$1 " \n |awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' | wc -l` (( Listeningnum = TCPListeningnum + UDPListeningnum )) if [ $Listeningnum == 0 ] then { echo "0" } else { echo "1" } fi } |
示例演示:
1)源程式(例如查詢 8080 埠的狀態是否在監聽)
isListen=`Listening 8080` if [ $isListen -eq 1 ] then { echo "The port is listening" } else { echo "The port is not listening" } fi |
2)結果輸出
The port is listening [[email protected] shell]$ |
3)結果分析
從上面的輸出可見:這個 Linux 伺服器的 8080 埠處在監聽狀態。
4)命令介紹
netstat: 用於顯示與 IP、TCP、UDP 和 ICMP 協議相關的統計資料,一般用於檢驗本機各埠的網路連線情況。 |
下面的功能也是檢測某個 TCP 或者 UDP 埠是否處在正常狀態。
tcp: netstat -an|egrep $1 |awk '$6 == "LISTEN" && $1 == "tcp" {print $0}' udp: netstat -an|egrep $1 |awk '$1 == "udp" && $5 == "0.0.0.0:*" {print $0}' |
命令介紹
egrep: 在檔案內查詢指定的字串。egrep 執行效果如 grep -E,使用的語法及引數可參照 grep 指令,與 grep 不同點在於解讀字串的方法,egrep 是用擴充套件的正則表示式語法來解讀,而 grep 則用基本的正則表示式語法,擴充套件的正則表示式比基本的正則表示式有更完整的表達規範。 |
檢視某個程序名正在執行的個數
有時我們可能需要得到伺服器上某個程序的啟動個數,下面的功能是檢測某個程序正在執行的個數,例如程序名為 CFTestApp。
Runnum=`ps -ef | grep -v vi | grep -v tail | grep "[ /]CFTestApp" | grep -v grep | wc -l |
檢測系統 CPU 負載
在對伺服器進行維護時,有時也遇到由於系統 CPU(利用率)負載 過量導致業務中斷的情況。伺服器上可能執行多個程序,檢視單個程序的 CPU 都是正常的,但是整個系統的 CPU 負載可能是異常的。通過指令碼對系統 CPU 負載進行時時監控,可以在異常時及時傳送告警,便於維護人員及時處理,預防事故發生。下面的函式可以檢測系統 CPU 使用情況 . 使用 vmstat 取 5 次系統 CPU 的 idle 值,取平均值,然後通過與 100 取差得到當前 CPU 的實際佔用值。
function GetSysCPU { CpuIdle=`vmstat 1 5 |sed -n '3,$p' \n |awk '{x = x + $15} END {print x/5}' |awk -F. '{print $1}' CpuNum=`echo "100-$CpuIdle" | bc` echo $CpuNum } |
示例演示:
1)源程式
cpu=`GetSysCPU` echo "The system CPU is $cpu" if [ $cpu -gt 90 ] then { echo "The usage of system cpu is larger than 90%" } else { echo "The usage of system cpu is normal" } fi |
2)結果輸出
The system CPU is 87 The usage of system cpu is normal [[email protected] shell]$ |
3)結果分析
從上面的輸出可見:當前 Linux 伺服器系統 CPU 利用率為 87%,是正常的,沒有超過 90% 的告警限制。
4)命令介紹
vmstat:Virtual Meomory Statistics(虛擬記憶體統計)的縮寫,可對作業系統的虛擬記憶體、程序、CPU 活動進行監視。 |
檢測系統磁碟空間
系統磁碟空間檢測是系統資源檢測的重要部分,在系統維護維護中,我們經常需要檢視伺服器磁碟空間使用情況。因為有些業務要時時寫話單,日誌,或者臨時檔案等,如果磁碟空間用盡,也可能會導致業務中斷,下面的函式可以檢測當前系統磁碟空間中某個目錄的磁碟空間使用情況 . 輸入引數為需要檢測的目錄名,使用 df 輸出系統磁碟空間使用資訊,然後通過 grep 和 awk 過濾得到某個目錄的磁碟空間使用百分比。
function GetDiskSpc { if [ $# -ne 1 ] then return 1 fi Folder="$1$" DiskSpace=`df -k |grep $Folder |awk '{print $5}' |awk -F% '{print $1}' echo $DiskSpace } |
示例演示:
1)源程式(檢測目錄為 /boot)
Folder="/boot" DiskSpace=`GetDiskSpc $Folder` echo "The system $Folder disk space is $DiskSpace%" if [ $DiskSpace -gt 90 ] then { echo "The usage of system disk($Folder) is larger than 90%" } else { echo "The usage of system disk($Folder) is normal" } fi |
2)結果輸出
The system /boot disk space is 14% The usage of system disk(/boot) is normal [[email protected] shell]$ |
3)結果分析
從上面的輸出可見:當前此 Linux 伺服器系統上 /boot 目錄的磁碟空間已經使用了 14%,是正常的,沒有超過使用 90% 的告警限制。
4)命令介紹
df:檢查檔案系統的磁碟空間佔用情況。可以利用該命令來獲取硬碟被佔用了多少空間,目前還剩下多少空間等資訊。 |
總結
在 Linux 平臺下,shell 指令碼監控是一個非常簡單,方便,有效的對伺服器,程序進行監控的方法,對系統開發以及程序維護人員非常有幫助。它不僅可以對上面的資訊進行監控,傳送告警,同時也可以監控程序的日誌等等的資訊,希望本文對大家有幫助。
相關推薦
使用shell 指令碼對 Linux 系統程序的CPU使用率與記憶體資源進行監控
Shell 簡介 Shell 語言對於接觸 LINUX 的人來說都比較熟悉,它是系統的使用者介面,提供了使用者與核心進行互動操作的一種介面。它接收使用者輸入的命令並把它送入核心去執行。實際上 Shell 是一個命令直譯器,它解釋由使用者輸入的命令並且把它們送到核心。它沒有一般程式語言的“編譯 - 連結 -
Shell指令碼實現Linux系統和程序資源監控
在伺服器運維過程中,經常需要對伺服器的各種資源進行監控,例如:CPU的負載監控,磁碟的使用率監控,程序數目監控等等,以在系統出現異常時及時報警,通知系統管理員。本文介紹在Linux系統下幾種常見的監控需求及其shell指令碼的編寫。 文章目錄: 1.Linux使用 She
shell指令碼實現linux系統監控
一、系統監控要監控什麼? 硬體 CPU: [[email protected] ~]# top | sed -n '3p' 記憶體: 檢視系統記憶體的使用情況: 硬碟: 檢視磁碟的使用情況 系統 負載: 系統執行時間: 檢視作業系統的版
Shell指令碼對Linux進行檔案校驗
一、需求 有客戶等保需求對檔案一致性進行校驗,想到利用md5sum工具,因此寫指令碼來對檔案進行自定義掃描,後期可以利用其進行校驗,快速校驗檔案發現變更的檔案,一定程度及時發現等行為。 二、指令碼 利用md5sum將掃描得到的檔案儲存在/tmp目錄下,字尾為時間戳,後期可以利用此檔案進行校驗 #!/b
java對Linux系統的CPU利用率的計算和記憶體資訊的獲取
程序檔案系統,procfs,是一個偽檔案系統,它允許對一些非傳統意義上的檔案通過標準檔案I/O介面進行訪問。procfs將Solaris核心程序架構進行了抽象,當前系統中所有執行著的程序會在/proc/目錄下有所體現。/proc/目錄下的物件不是真實磁碟檔案,這
linux shell指令碼給郵箱發磁碟cpu記憶體資訊
1首先下載mailx和 mailx sendmail yum -y install mailx yum -y install mailx sendmail 2選擇自己接收的郵箱 比如QQ郵箱 在設定裡按步驟開啟IMAP/SMTP服務 第三步需要郵箱驗證 請耐
編寫shell指令碼檢視linux當前各使用者的cpu和memory消耗比例
為了方便自己檢視centOS上的各使用者cpu和記憶體的使用比例,寫了shell指令碼。 viewUsage.sh #!/bin/bash # # view the cpu and memory consumption of each user at the current
linux shell指令碼對未定義變數的判斷以及if的用法
環境 作業系統:win10 虛擬機器:centos7 需求 因為公司有個指令碼,是用於啟動程式的,但是每次啟動都要手動做如下兩個操作: ①先查詢之前的程序ID ②殺死之前的,在啟動新了 時間長了弄得我很煩躁,所以就琢磨下,把上面的的操作一起整合
說一說本人對linux系統學習的方法和經驗
linux 百度 應用程序 操作系統 多線程 相信大夥都聽說過linux系統,然而對於這個系統,總使讓新手感覺茫然,諾達的系統。下面是一段百度中的介紹:Linux系統是一套開源的並且能夠自由傳播的類似與Unix操作系統,是一個基於POSIX和UNIX的多任務、多用戶、支持多線程和多CPU的
Python對Linux系統的操作模塊
管理 init soc affinity virtual 系統 time save cache 1、pip安裝(pip 是“A tool for installing and managing Python packages.”,也就是說pip是python的軟件安裝工具)
談談我對Linux系統學習的歷程回顧
linux眾所周知,Windows 和Linux 是目前最流行的2個操作系統。Windows系統適合普通用戶,它的優勢是圖形化界面,簡單易用,使用起來門檻很低,很容易上手,所以,windows占有了大多數普通用戶群體。而Linux 被譽為黑客的操作系統,因其穩定和命令行操作的高效性而廣泛用於開發工作,占有絕大
Linux系統排查——CPU負載篇
stdout 0.00 swap stat cpu 隨筆 2.7 bin tasks 本隨筆介紹CPU負載的排查手段。 查看系統負載的工具:uptime,w,都能查看系統負載,系統平均負載是處於運行或不可打擾狀態的進程的平均數, 可運行:運行態,占用CPU,或就
linux系統程序安裝(一)rpm工具
erl fields program 軟件 方法 owin lib 直接 源碼安裝 linux系統下程序安裝主要采用三種方式:1、rpm,有點類似.msi 和.exe比較類似,軟件包(相當於windows的某個程序的所有文件)的安裝路徑和文件名稱基本是固定的,但是他不會安裝
linux系統程序安裝(一)yum工具
sync 內容 sim lean provide for 就是 grep 大型 yum安裝工具類似appstore,運用yum工具可以方便的下載所需的程序,同時yum工具會自動檢查程序的依賴關系,並安裝相應的依賴包,有點像windows的某些大型軟件安裝程序會自動檢查幫你安
linux系統程序安裝(二)yum工具2-yum源管理
內容 centos 備份 hang clean 原生 yum 聯網 系統 繼續我們的yum工具應用之旅,yum工具之所以方便就是因為有方便的在線雲庫,實際工作中我們可能沒辦法鏈接互聯網,或者我們想安裝的程序原生源那麽我們能不能用其他方式應用方便的yum源呢? 一、使用光盤
linux系統程序安裝(三)源碼包安裝程序
efi ron 下載 示例 wget 問題 位置 提示 /usr 源碼包安裝是日常使用過程中最經常的安裝方式,比如nagios套件、apche等重要軟件都是源碼包方式安裝,源碼包編譯安裝技術是運維技術中比較重要的部分。 一、源碼包安裝位置 運維時,最好把要跑的業務包放到/u
基於Shell指令碼的Linux下Javaweb專案一鍵部署
剛買到伺服器的時候想把專案部署上去時,經常會用到各種scp、unzip之類一大堆的命令。雖然整個流程不是特別麻煩,不過學了一些Shell的命令知識之後我發現這個過程還是有優化的空間,於是大概花了幾個小時完成了這樣一個自動部署的指令碼。 首先要解決的問題是,命令如何在遠端伺服器上執行,因為之前每次
一、linux 系統程序通訊之記憶體對映
linux下程序間通訊方式一般有管道,訊息佇列,共享記憶體,訊號量,訊號,套接字以及有名管道,其中共享記憶體的效率最高,而記憶體對映mmap就是共享記憶體的一種。下面詳細介紹一種使用共享記憶體實現程序間通訊的方式。 在Android系統中屬性被大量的使用,用來記錄系統設定或程序之間的資訊交換。
linux----系統程序及服務的控制
1.什麼是程序 程序就是系統為完成且正在進行的工作 2.檢視程序 1>圖形方式檢視 gnome-system-monitor 2>程序檢視命令 ps -A 所有程序 -a 在當前環境中執行的程序,不包含環境資訊 -u 顯示程序的使用者資訊 a 在當前環境中執行的程序 x 列出系
《00002》對Linux系統管理員的建議
養成安全嚴謹的習慣 作為Linux系統管理員,你面對的是伺服器而不是自己的計算機。我們在日常管理工作中,做任何一件事情都有可能引起重大事故,所以你一定要養成嚴謹的習慣。 養成備份的習慣 伺服器上跑的資料的重要性是不言而喻的,所以,一定要注意資料的安全。我們