1. 
          

          1. 新聞動(dòng)態(tài)

            使用 shell 腳本對 Linux 系統和進(jìn)程資源進(jìn)行監控

            網(wǎng)站優(yōu)化 發(fā)布者:cya 2020-01-04 09:07 訪(fǎng)問(wèn)量:348

            來(lái)自:IBM Developer

            鏈接:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-monitoring/

            Shell 簡(jiǎn)介

            Shell 語(yǔ)言對于接觸 LINUX 的人來(lái)說(shuō)都比較熟悉,它是系統的用戶(hù)界面,提供了用戶(hù)與內核進(jìn)行交互操作的一種接口。它接收用戶(hù)輸入的命令并把它送入內核去執行。實(shí)際上 Shell 是一個(gè)命令解釋器,它解釋由用戶(hù)輸入的命令并且把它們送到內核。它沒(méi)有一般編程語(yǔ)言的“編譯 - 鏈接 - 運行”過(guò)程。不僅如此,Shell 有自己的編程語(yǔ)言用于對命令的編輯,它允許用戶(hù)編寫(xiě)由 shell 命令組成的程序。Shell 編程語(yǔ)言具有普通編程語(yǔ)言的很多特點(diǎn),比如它也有循環(huán)結構和分支控制結構等,用這種編程語(yǔ)言編寫(xiě)的 Shell 程序與其他應用程序具有同樣的效果。當然,Shell 功能也是很強大的。Shell 有多種類(lèi)型,其中最常用的幾種是 Bourne shell(sh)、C shell(csh)和 Korn shell(ksh)。三種 shell 各有優(yōu)缺點(diǎn),Linux 操作系統缺省的 shell 一般是 Bourne Again shell,它是 Bourne shell 的擴展,簡(jiǎn)稱(chēng) Bash,bash 的命令語(yǔ)法是 Bourne shell 命令語(yǔ)法的超集,并且在 Bourne shell 的基礎上增加、增強了很多特性。在這里,我們以 Bash 做為實(shí)例總結了使用 Shell 對系統和進(jìn)程資源進(jìn)行監控的一些內容,希望對您能有幫助。

            使用 Shell 對進(jìn)程資源進(jìn)行監控

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


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


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


            function GetPID #User #Name 

               PsUser=$1 
               PsName=$2 
               pid=`ps -u $PsUser|grep $PsName|grep -v grep|grep -v vi|grep -v dbx  
               |grep -v tail|grep -v start|grep -v stop |sed -n 1p |awk '{print $1}'
               echo $pid 
            }


            示例演示:


            1)源程序(例如查找用戶(hù)為 root,進(jìn)程名為 CFTestApp 的進(jìn)程 ID)


            PID=`GetPID root CFTestApp` 

            echo $PID


            2)結果輸出


            11426 
            [dyu@xilinuxbldsrv shell]$


            3)結果分析


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


            4)命令介紹


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


            有時(shí)有可能進(jìn)程沒(méi)有啟動(dòng),下面的功能是檢查進(jìn)程 ID 是否存在,如果此進(jìn)程沒(méi)有運行輸出:


            The process does not exist. 
            # 檢查進(jìn)程是否存在
            if [ "-$PID" == "-" ] 
            then 

                echo "The process does not exist."

            fi


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


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


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


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


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


            清單 3. 判斷 CPU 利用率是否超過(guò)限制


            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)查詢(xún)出 CFTestApp 的進(jìn)程 ID 為 11426)


            CheckCpu 11426


            2)結果輸出


            The usage of cpu is 75 
            The usage of cpu is normal 
            [dyu@xilinuxbldsrv shell]$


            3)結果分析


            從上面的輸出可見(jiàn):CFTestApp 程序當前的 CPU 使用為 75%,是正常的,沒(méi)有超過(guò) 80% 的告警限制。


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


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


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


            function GetMem 

                MEMUsage=`ps -o vsz -p $1|grep -v VSZ` 
                (( MEMUsage /= 1000)) 
                echo $MEMUsage 
            }


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


            清單 5. 判斷內存使用是否超過(guò)限制


            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)查詢(xún)出 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)結果輸出


            The usage of memory is 248 M 
            The usage of memory is normal 
            [dyu@xilinuxbldsrv shell]$


            3)結果分析


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


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


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


            function GetDes 

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


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


            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)源程序(假設上面查詢(xún)出 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)結果輸出


            The number of des is 528 
            The number of des is normal 
            [dyu@xilinuxbldsrv shell]$


            3)結果分析


            從上面的輸出可見(jiàn):CFTestApp 程序當前的句柄使用為 528 個(gè),是正常的,沒(méi)有超過(guò) 900 個(gè)的告警限制。


            4)命令介紹


            wc: 統計指定文件中的字節數、字數、行數 , 并將統計結果顯示輸出。參數:-l 統計行數。-c 統計字節數。-w 統計字數。

            使用 Shell 對系統資源進(jìn)行監控

            查看某個(gè) TCP 或 UDP 端口是否在監聽(tīng)


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


            清單 6. 端口檢測


            function Listening 

               TCPListeningnum=`netstat -an | grep ":$1 " | 
               awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l` 
               UDPListeningnum=`netstat -an|grep ":$1 " 
               |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)源程序(例如查詢(xún) 8080 端口的狀態(tài)是否在監聽(tīng))


            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)結果分析


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


            4)命令介紹


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


            下面的功能也是檢測某個(gè) 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 執行效果如 grep -E,使用的語(yǔ)法及參數可參照 grep 指令,與 grep 不同點(diǎn)在于解讀字符串的方法,egrep 是用擴展的正則表達式語(yǔ)法來(lái)解讀,而 grep 則用基本的正則表達式語(yǔ)法,擴展的正則表達式比基本的正則表達式有更完整的表達規范。


            查看某個(gè)進(jìn)程名正在運行的個(gè)數


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


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


            檢測系統 CPU 負載


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


            function GetSysCPU 

              CpuIdle=`vmstat 1 5 |sed -n '3,$p' 
              |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)結果分析


            從上面的輸出可見(jiàn):當前 Linux 服務(wù)器系統 CPU 利用率為 87%,是正常的,沒(méi)有超過(guò) 90% 的告警限制。


            4)命令介紹


            vmstat:Virtual Meomory Statistics(虛擬內存統計)的縮寫(xiě),可對操作系統的虛擬內存、進(jìn)程、CPU 活動(dòng)進(jìn)行監視。


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


            檢測系統磁盤(pán)空間


            系統磁盤(pán)空間檢測是系統資源檢測的重要部分,在系統維護維護中,我們經(jīng)常需要查看服務(wù)器磁盤(pán)空間使用情況。因為有些業(yè)務(wù)要時(shí)時(shí)寫(xiě)話(huà)單,日志,或者臨時(shí)文件等,如果磁盤(pán)空間用盡,也可能會(huì )導致業(yè)務(wù)中斷,下面的函數可以檢測當前系統磁盤(pán)空間中某個(gè)目錄的磁盤(pán)空間使用情況 . 輸入參數為需要檢測的目錄名,使用 df 輸出系統磁盤(pán)空間使用信息,然后通過(guò) grep 和 awk 過(guò)濾得到某個(gè)目錄的磁盤(pán)空間使用百分比。


            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)結果分析


            從上面的輸出可見(jiàn):當前此 Linux 服務(wù)器系統上 /boot 目錄的磁盤(pán)空間已經(jīng)使用了 14%,是正常的,沒(méi)有超過(guò)使用 90% 的告警限制。


            4)命令介紹


            df:檢查文件系統的磁盤(pán)空間占用情況??梢岳迷撁顏?lái)獲取硬盤(pán)被占用了多少空間,目前還剩下多少空間等信息。參數:-k 以 k 字節為單位顯示。

            總結

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



            關(guān)鍵字: shell 腳本 Linux 系統 進(jìn)程資源監控.

            文章連接: http://www.gostscript.com/wzyh/667.html

            版權聲明:文章由 晨展科技 整理收集,來(lái)源于互聯(lián)網(wǎng)或者用戶(hù)投稿,如有侵權,請聯(lián)系我們,我們會(huì )立即刪除。如轉載請保留

            双腿国产亚洲精品无码不卡|国产91精品无码麻豆|97久久久久久久极品|无码人妻少妇久久中文字幕
                1.