萬盛學電腦網

 萬盛學電腦網 >> 腳本專題 >> javascript >> Shell腳本實現Linux系統和進程資源監控

Shell腳本實現Linux系統和進程資源監控

 這篇文章主要介紹了Shell腳本實現Linux系統和進程資源監控,本文講解了檢查進程是否存在、檢測進程 CPU 利用率、檢測進程內存使用量、檢測進程句柄使用量、,需要的朋友可以參考下

   

在服務器運維過程中,經常需要對服務器的各種資源進行監控,例如:CPU的負載監控,磁盤的使用率監控,進程數目監控等等,以在系統出現異常時及時報警,通知系統管理員。本文介紹在Linux系統下幾種常見的監控需求及其shell腳本的編寫。

文章目錄:

1.Linux使用 Shell 檢查進程是否存在
2.Linux使用 Shell檢測進程 CPU 利用率
3.Linux使用 Shell檢測進程內存使用量
4.Linux使用 Shell檢測進程句柄使用量
5.Linux使用 Shell查看某個 TCP 或 UDP 端口是否在監聽
6.Linux使用 Shell查看某個進程名正在運行的個數
7.Linux使用 Shell檢測系統 CPU 負載
8.Linux使用 Shell檢測系統磁盤空間
9.總結

檢查進程是否存在

在對進程進行監控時,我們一般需要得到該進程的 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 dbxn
|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
[dyu@xilinuxbldsrv shell]$

 

3)結果分析

從上面的輸出可見:11426 為 root 用戶下的 CFTestApp 程序的進程 ID。

4)命令介紹

1. ps: 查看系統中瞬間進程信息。 參數:-u< 用戶識別碼 > 列出屬於該用戶的程序的狀況,也可使用用戶名稱來指定。 -p< 進程識別碼 > 指定進程識別碼,並列出該進程的狀況。 -o 指定輸出格式 2. grep: 用於查找文件中符合字符串的當前行。 參數:-v 反向選擇,亦即顯示出沒有 ‘搜尋字符串' 內容的那一行。 3. sed: 一個非交互性文本編輯器,它編輯文件或標准輸入導出的文件,一次只能處理一行內容。 參數:-n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。 p 標志 打印匹配行 4. awk:一種編程語言,用於在 linux/unix 下對文本和數據進行處理。數據可以來自標准輸入、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是 linux/unix 下的一個強大編程工具。它在命令行中使用,但更多是作為腳本來使用。awk 的處理文本和數據的方式:它逐行掃描文件,從第一行到最後一行,尋找匹配的特定模式的行,並在這些行上進行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標准輸出 ( 屏幕 ),如果沒有指定模式,則所有被操作所指定的行都被處理。 參數:-F fs or –field-separator fs :指定輸入文件折分隔符,fs 是一個字符串或者是一個正則表達式,如 -F:。
有時有可能進程沒有啟動,下面的功能是檢查進程 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
[dyu@xilinuxbldsrv 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
[dyu@xilinuxbldsrv 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
}

 

下面功能是通過上

copyright © 萬盛學電腦網 all rights reserved