Shell腳本實(shí)現(xiàn)Linux系統(tǒng)和進(jìn)程資源監(jiān)控
來源:易賢網(wǎng) 閱讀:661 次 日期:2015-03-09 17:36:19
溫馨提示:易賢網(wǎng)小編為您整理了“Shell腳本實(shí)現(xiàn)Linux系統(tǒng)和進(jìn)程資源監(jiān)控”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了Shell腳本實(shí)現(xiàn)Linux系統(tǒng)和進(jìn)程資源監(jiān)控,本文講解了檢查進(jìn)程是否存在、檢測進(jìn)程 CPU 利用率、檢測進(jìn)程內(nèi)存使用量、檢測進(jìn)程句柄使用量、,需要的朋友可以參考下

在服務(wù)器運(yùn)維過程中,經(jīng)常需要對服務(wù)器的各種資源進(jìn)行監(jiān)控,例如:CPU的負(fù)載監(jiān)控,磁盤的使用率監(jiān)控,進(jìn)程數(shù)目監(jiān)控等等,以在系統(tǒng)出現(xiàn)異常時及時報警,通知系統(tǒng)管理員。本文介紹在Linux系統(tǒng)下幾種常見的監(jiān)控需求及其shell腳本的編寫。

文章目錄:

1.Linux使用 Shell 檢查進(jìn)程是否存在

2.Linux使用 Shell檢測進(jìn)程 CPU 利用率

3.Linux使用 Shell檢測進(jìn)程內(nèi)存使用量

4.Linux使用 Shell檢測進(jìn)程句柄使用量

5.Linux使用 Shell查看某個 TCP 或 UDP 端口是否在監(jiān)聽

6.Linux使用 Shell查看某個進(jìn)程名正在運(yùn)行的個數(shù)

7.Linux使用 Shell檢測系統(tǒng) CPU 負(fù)載

8.Linux使用 Shell檢測系統(tǒng)磁盤空間

9.總結(jié)

檢查進(jìn)程是否存在

在對進(jìn)程進(jìn)行監(jiān)控時,我們一般需要得到該進(jìn)程的 ID,進(jìn)程 ID 是進(jìn)程的唯一標(biāo)識,但是有時可能在服務(wù)器上不同用戶下運(yùn)行著多個相同進(jìn)程名的進(jìn)程,下面的函數(shù) GetPID 給出了獲取指定用戶下指定進(jìn)程名的進(jìn)程 ID 功能(目前只考慮這個用戶下啟動一個此進(jìn)程名的進(jìn)程),它有兩個參數(shù)為用戶名和進(jìn)程名,它首先使用 ps 查找進(jìn)程信息,同時通過 grep 過濾出需要的進(jìn)程,最后通過 sed 和 awk 查找需要進(jìn)程的 ID 值(此函數(shù)可根據(jù)實(shí)際情況修改,比如需要過濾其它信息等)。

清單 1. 對進(jìn)程進(jìn)行監(jiān)控

代碼如下:

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,進(jìn)程名為 CFTestApp 的進(jìn)程 ID)

代碼如下:

PID=`GetPID root CFTestApp`

echo $PID

2)結(jié)果輸出

代碼如下:

11426

[dyu@xilinuxbldsrv shell]$

3)結(jié)果分析

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

4)命令介紹

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

有時有可能進(jìn)程沒有啟動,下面的功能是檢查進(jìn)程 ID 是否存在,如果此進(jìn)程沒有運(yùn)行輸出:

代碼如下:

The process does not exist.

# 檢查進(jìn)程是否存在

if [ "-$PID" == "-" ]

then

{

echo "The process does not exist."

}

fi

檢測進(jìn)程 CPU 利用率

在對應(yīng)用服務(wù)進(jìn)行維護(hù)時,我們經(jīng)常遇到由于 CPU 過高導(dǎo)致業(yè)務(wù)阻塞,造成業(yè)務(wù)中斷的情況。CPU 過高可能由于業(yè)務(wù)量過負(fù)荷或者出現(xiàn)死循環(huán)等異常情況,通過腳本對業(yè)務(wù)進(jìn)程 CPU 進(jìn)行時時監(jiān)控,可以在 CPU 利用率異常時及時通知維護(hù)人員,便于維護(hù)人員及時分析,定位,以及避免業(yè)務(wù)中斷等。下面的函數(shù)可獲得指定進(jìn)程 ID 的進(jìn)程 CPU 利用率。它有一個參數(shù)為進(jìn)程 ID,它首先使用 ps 查找進(jìn)程信息,同時通過 grep -v 過濾掉 %CPU 行,最后通過 awk 查找 CPU 利用百分比的整數(shù)部分(如果系統(tǒng)中有多個 CPU,CPU 利用率可以超過 100%)。

清單 2. 對業(yè)務(wù)進(jìn)程 CPU 進(jìn)行實(shí)時監(jiān)控

代碼如下:

function GetCpu

{

CpuValue=`ps -p $1 -o pcpu |grep -v CPU | awk '{print $1}' | awk - F. '{print $1}'`

echo $CpuValue

}

下面的功能是通過上面的函數(shù) GetCpu 獲得此進(jìn)程的 CPU 利用率,然后通過條件語句判斷 CPU 利用率是否超過限制,如果超過 80%(可以根據(jù)實(shí)際情況進(jìn)行調(diào)整),則輸出告警,否則輸出正常信息。

清單 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)源程序(假設(shè)上面已經(jīng)查詢出 CFTestApp 的進(jìn)程 ID 為 11426)

代碼如下:

CheckCpu 11426

2)結(jié)果輸出

代碼如下:

The usage of cpu is 75

The usage of cpu is normal

[dyu@xilinuxbldsrv shell]$

3)結(jié)果分析

從上面的輸出可見:CFTestApp 程序當(dāng)前的 CPU 使用為 75%,是正常的,沒有超過 80% 的告警限制。

檢測進(jìn)程內(nèi)存使用量

在對應(yīng)用服務(wù)進(jìn)行維護(hù)時,也經(jīng)常遇到由于內(nèi)存使用過大導(dǎo)致進(jìn)程崩潰,造成業(yè)務(wù)中斷的情況(例如 32 位程序可尋址的最大內(nèi)存空間為 4G,如果超出將申請內(nèi)存失敗,同時物理內(nèi)存也是有限的)。內(nèi)存使用過高可能由于內(nèi)存泄露,消息堆積等情況,通過腳本對業(yè)務(wù)進(jìn)程內(nèi)存使用量進(jìn)行時時監(jiān)控,可以在內(nèi)存使用量異常時及時發(fā)送告警(例如通過短信),便于維護(hù)人員及時處理。下面的函數(shù)可獲得指定進(jìn)程 ID 的進(jìn)程內(nèi)存使用情況。它有一個參數(shù)為進(jìn)程 ID,它首先使用 ps 查找進(jìn)程信息,同時通過 grep -v 過濾掉 VSZ 行 , 然后通過除 1000 取以兆為單位的內(nèi)存使用量。

清單 4. 對業(yè)務(wù)進(jìn)程內(nèi)存使用量進(jìn)行監(jiān)控

代碼如下:

function GetMem

{

MEMUsage=`ps -o vsz -p $1|grep -v VSZ`

(( MEMUsage /= 1000))

echo $MEMUsage

}

下面的功能是通過上面的函數(shù) GetMem獲得此進(jìn)程的內(nèi)存使用,然后通過條件語句判斷內(nèi)存使用是否超過限制,如果超過 1.6G(可以根據(jù)實(shí)際情況進(jìn)行調(diào)整),則輸出告警,否則輸出正常信息。

清單 5. 判斷內(nèi)存使用是否超過限制

代碼如下:

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)源程序(假設(shè)上面已經(jīng)查詢出 CFTestApp 的進(jìn)程 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)結(jié)果輸出

代碼如下:

The usage of memory is 248 M

The usage of memory is normal

[dyu@xilinuxbldsrv shell]$

3)結(jié)果分析

從上面的輸出可見:CFTestApp 程序當(dāng)前的內(nèi)存使用為 248M,是正常的,沒有超過 1.6G 的告警限制。

檢測進(jìn)程句柄使用量

在對應(yīng)用服務(wù)進(jìn)行維護(hù)時,也經(jīng)常遇到由于句柄使用 過量導(dǎo)致業(yè)務(wù)中斷的情況。每個平臺對進(jìn)程的句柄使用都是有限的,例如在 Linux 平臺,我們可以使用 ulimit – n 命令(open files (-n) 1024)或者對 /etc/security/limits.conf 的內(nèi)容進(jìn)行查看,得到進(jìn)程句柄限制。句柄使用過高可能由于負(fù)載過高,句柄泄露等情況,通過腳本對業(yè)務(wù)進(jìn)程句柄使用量進(jìn)行時時監(jiān)控,可以在異常時及時發(fā)送告警(例如通過短信),便于維護(hù)人員及時處理。下面的函數(shù)可獲得指定進(jìn)程 ID 的進(jìn)程句柄使用情況。它有一個參數(shù)為進(jìn)程 ID,它首先使用 ls 輸出進(jìn)程句柄信息,然后通過 wc -l 統(tǒng)計(jì)輸出句柄個數(shù)。

代碼如下:

function GetDes

{

DES=`ls /proc/$1/fd | wc -l`

echo $DES

}

下面功能是通過上面的函數(shù) GetDes獲得此進(jìn)程的句柄使用量,然后通過條件語句判斷句柄使用是否超過限制,如果超過 900(可以根據(jù)實(shí)際情況進(jìn)行調(diào)整)個,則輸出告警,否則輸出正常信息。

代碼如下:

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)源程序(假設(shè)上面查詢出 CFTestApp 的進(jìn)程 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)結(jié)果輸出

代碼如下:

The number of des is 528

The number of des is normal

[dyu@xilinuxbldsrv shell]$

3)結(jié)果分析

從上面的輸出可見:CFTestApp 程序當(dāng)前的句柄使用為 528 個,是正常的,沒有超過 900 個的告警限制。

4)命令介紹

wc: 統(tǒng)計(jì)指定文件中的字節(jié)數(shù)、字?jǐn)?shù)、行數(shù) , 并將統(tǒng)計(jì)結(jié)果顯示輸出。 參數(shù):-l 統(tǒng)計(jì)行數(shù)。 -c 統(tǒng)計(jì)字節(jié)數(shù)。 -w 統(tǒng)計(jì)字?jǐn)?shù)。

查看某個 TCP 或 UDP 端口是否在監(jiān)聽

端口檢測是系統(tǒng)資源檢測經(jīng)常遇到的,特別是在網(wǎng)絡(luò)通訊情況下,端口狀態(tài)的檢測往往是很重要的。有時可能進(jìn)程,CPU,內(nèi)存等處于正常狀態(tài),但是端口處于異常狀態(tài),業(yè)務(wù)也是沒有正常運(yùn)行。下面函數(shù)可判斷指定端口是否在監(jiān)聽。它有一個參數(shù)為待檢測端口,它首先使用 netstat 輸出端口占用信息,然后通過 grep, awk,wc 過濾輸出監(jiān)聽 TCP 端口的個數(shù),第二條語句為輸出 UDP 端口的監(jiān)聽個數(shù),如果 TCP 與 UDP 端口監(jiān)聽都為 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 端口的狀態(tài)是否在監(jiān)聽)

代碼如下:

isListen=`Listening 8080`

if [ $isListen -eq 1 ]

then

{

echo "The port is listening"

}

else

{

echo "The port is not listening"

}

fi

2)結(jié)果輸出

代碼如下:

The port is listening

[dyu@xilinuxbldsrv shell]$

3)結(jié)果分析

從上面的輸出可見:這個 Linux 服務(wù)器的 8080 端口處在監(jiān)聽狀態(tài)。

4)命令介紹

netstat: 用于顯示與 IP、TCP、UDP 和 ICMP 協(xié)議相關(guān)的統(tǒng)計(jì)數(shù)據(jù),一般用于檢驗(yàn)本機(jī)各端口的網(wǎng)絡(luò)連接情況。 參數(shù):-a 顯示所有連線中的 Socket。 -n 直接使用 IP 地址,而不通過域名服務(wù)器。

下面的功能也是檢測某個 TCP 或者 UDP 端口是否處在正常狀態(tài)。

代碼如下:

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: 在文件內(nèi)查找指定的字符串。egrep 執(zhí)行效果如 grep -E,使用的語法及參數(shù)可參照 grep 指令,與 grep 不同點(diǎn)在于解讀字符串的方法,egrep 是用擴(kuò)展的正則表達(dá)式語法來解讀,而 grep 則用基本的正則表達(dá)式語法,擴(kuò)展的正則表達(dá)式比基本的正則表達(dá)式有更完整的表達(dá)規(guī)范。

查看某個進(jìn)程名正在運(yùn)行的個數(shù)

有時我們可能需要得到服務(wù)器上某個進(jìn)程的啟動個數(shù),下面的功能是檢測某個進(jìn)程正在運(yùn)行的個數(shù),例如進(jìn)程名為 CFTestApp。

代碼如下:

Runnum=`ps -ef | grep -v vi | grep -v tail | grep "[ /]CFTestApp" | grep -v grep | wc -l

檢測系統(tǒng) CPU 負(fù)載

在對服務(wù)器進(jìn)行維護(hù)時,有時也遇到由于系統(tǒng) CPU(利用率)負(fù)載 過量導(dǎo)致業(yè)務(wù)中斷的情況。服務(wù)器上可能運(yùn)行多個進(jìn)程,查看單個進(jìn)程的 CPU 都是正常的,但是整個系統(tǒng)的 CPU 負(fù)載可能是異常的。通過腳本對系統(tǒng) CPU 負(fù)載進(jìn)行時時監(jiān)控,可以在異常時及時發(fā)送告警,便于維護(hù)人員及時處理,預(yù)防事故發(fā)生。下面的函數(shù)可以檢測系統(tǒng) CPU 使用情況 . 使用 vmstat 取 5 次系統(tǒng) CPU 的 idle 值,取平均值,然后通過與 100 取差得到當(dāng)前 CPU 的實(shí)際占用值。

代碼如下:

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)結(jié)果輸出

代碼如下:

The system CPU is 87

The usage of system cpu is normal

[dyu@xilinuxbldsrv shell]$

3)結(jié)果分析

從上面的輸出可見:當(dāng)前 Linux 服務(wù)器系統(tǒng) CPU 利用率為 87%,是正常的,沒有超過 90% 的告警限制。

4)命令介紹

vmstat:Virtual Meomory Statistics(虛擬內(nèi)存統(tǒng)計(jì))的縮寫,可對操作系統(tǒng)的虛擬內(nèi)存、進(jìn)程、CPU 活動進(jìn)行監(jiān)視。

參數(shù): -n 表示在周期性循環(huán)輸出時,輸出的頭部信息僅顯示一次。

檢測系統(tǒng)磁盤空間

系統(tǒng)磁盤空間檢測是系統(tǒng)資源檢測的重要部分,在系統(tǒng)維護(hù)維護(hù)中,我們經(jīng)常需要查看服務(wù)器磁盤空間使用情況。因?yàn)橛行I(yè)務(wù)要時時寫話單,日志,或者臨時文件等,如果磁盤空間用盡,也可能會導(dǎo)致業(yè)務(wù)中斷,下面的函數(shù)可以檢測當(dāng)前系統(tǒng)磁盤空間中某個目錄的磁盤空間使用情況 . 輸入?yún)?shù)為需要檢測的目錄名,使用 df 輸出系統(tǒng)磁盤空間使用信息,然后通過 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)結(jié)果輸出

代碼如下:

The system /boot disk space is 14%

The usage of system disk(/boot) is normal

[dyu@xilinuxbldsrv shell]$

3)結(jié)果分析

從上面的輸出可見:當(dāng)前此 Linux 服務(wù)器系統(tǒng)上 /boot 目錄的磁盤空間已經(jīng)使用了 14%,是正常的,沒有超過使用 90% 的告警限制。

4)命令介紹

df:檢查文件系統(tǒng)的磁盤空間占用情況。可以利用該命令來獲取硬盤被占用了多少空間,目前還剩下多少空間等信息。 參數(shù):-k 以 k 字節(jié)為單位顯示。

總結(jié)

在 Linux 平臺下,shell 腳本監(jiān)控是一個非常簡單,方便,有效的對服務(wù)器,進(jìn)程進(jìn)行監(jiān)控的方法,對系統(tǒng)開發(fā)以及進(jìn)程維護(hù)人員非常有幫助。它不僅可以對上面的信息進(jìn)行監(jiān)控,發(fā)送告警,同時也可以監(jiān)控進(jìn)程的日志等等的信息,希望本文對大家有幫助。

更多信息請查看IT技術(shù)專欄

更多信息請查看網(wǎng)頁制作
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機(jī)號
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報警專用圖標(biāo)