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

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

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

文章目錄:

1.Linux使用 Shell 檢查進程是否存在

2.Linux使用 Shell檢測進程 CPU 利用率

3.Linux使用 Shell檢測進程內存使用量

4.Linux使用 Shell檢測進程句柄使用量

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

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

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

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

9.總結

檢查進程是否存在

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

清單 1. 對進程進行監(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,進程名為 CFTestApp 的進程 ID)

代碼如下:

PID=`GetPID root CFTestApp`

echo $PID

2)結果輸出

代碼如下:

11426

[dyu@xilinuxbldsrv shell]$

3)結果分析

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

4)命令介紹

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

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

清單 2. 對業(yè)務進程 CPU 進行實時監(jiān)控

代碼如下:

function GetCpu

{

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

echo $CpuValue

}

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

清單 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)源程序(假設上面已經(jīng)查詢出 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% 的告警限制。

檢測進程內存使用量

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

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

代碼如下:

function GetMem

{

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

(( MEMUsage /= 1000))

echo $MEMUsage

}

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

清單 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)源程序(假設上面已經(jīng)查詢出 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 的告警限制。

檢測進程句柄使用量

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

代碼如下:

function GetDes

{

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

echo $DES

}

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

代碼如下:

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

[dyu@xilinuxbldsrv shell]$

3)結果分析

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

4)命令介紹

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

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

端口檢測是系統(tǒng)資源檢測經(jīng)常遇到的,特別是在網(wǎng)絡通訊情況下,端口狀態(tài)的檢測往往是很重要的。有時可能進程,CPU,內存等處于正常狀態(tài),但是端口處于異常狀態(tài),業(yè)務也是沒有正常運行。下面函數(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)結果輸出

代碼如下:

The port is listening

[dyu@xilinuxbldsrv shell]$

3)結果分析

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

4)命令介紹

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

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

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

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

代碼如下:

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

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

在對服務器進行維護時,有時也遇到由于系統(tǒng) CPU(利用率)負載 過量導致業(yè)務中斷的情況。服務器上可能運行多個進程,查看單個進程的 CPU 都是正常的,但是整個系統(tǒng)的 CPU 負載可能是異常的。通過腳本對系統(tǒng) CPU 負載進行時時監(jiān)控,可以在異常時及時發(fā)送告警,便于維護人員及時處理,預防事故發(fā)生。下面的函數(shù)可以檢測系統(tǒng) CPU 使用情況 . 使用 vmstat 取 5 次系統(tǒng) 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

[dyu@xilinuxbldsrv shell]$

3)結果分析

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

4)命令介紹

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

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

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

系統(tǒng)磁盤空間檢測是系統(tǒng)資源檢測的重要部分,在系統(tǒng)維護維護中,我們經(jīng)常需要查看服務器磁盤空間使用情況。因為有些業(yè)務要時時寫話單,日志,或者臨時文件等,如果磁盤空間用盡,也可能會導致業(yè)務中斷,下面的函數(shù)可以檢測當前系統(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)結果輸出

代碼如下:

The system /boot disk space is 14%

The usage of system disk(/boot) is normal

[dyu@xilinuxbldsrv shell]$

3)結果分析

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

4)命令介紹

df:檢查文件系統(tǒng)的磁盤空間占用情況??梢岳迷撁顏慝@取硬盤被占用了多少空間,目前還剩下多少空間等信息。 參數(shù):-k 以 k 字節(jié)為單位顯示。

總結

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

更多信息請查看IT技術專欄

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

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

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權所有:易賢網(wǎng)