1. 程式人生 > >Shell指令碼實現Linux系統和程序資源監控

Shell指令碼實現Linux系統和程序資源監控

在伺服器運維過程中,經常需要對伺服器的各種資源進行監控,例如: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 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: 檢視系統中瞬間程序資訊。 引數:-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
    [[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: 統計指定檔案中的位元組數、字數、行數 , 並將統計結果顯示輸出。 引數:-l 統計行數。 -c 統計位元組數。 -w 統計字數。

檢視某個 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 協議相關的統計資料,一般用於檢驗本機各埠的網路連線情況。 引數:-a 顯示所有連線中的 Socket。 -n 直接使用 IP 地址,而不通過域名伺服器。
下面的功能也是檢測某個 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 活動進行監視。
引數: -n 表示在週期性迴圈輸出時,輸出的頭部資訊僅顯示一次。

檢測系統磁碟空間

系統磁碟空間檢測是系統資源檢測的重要部分,在系統維護維護中,我們經常需要檢視伺服器磁碟空間使用情況。因為有些業務要時時寫話單,日誌,或者臨時檔案等,如果磁碟空間用盡,也可能會導致業務中斷,下面的函式可以檢測當前系統磁碟空間中某個目錄的磁碟空間使用情況 . 輸入引數為需要檢測的目錄名,使用 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:檢查檔案系統的磁碟空間佔用情況。可以利用該命令來獲取硬碟被佔用了多少空間,目前還剩下多少空間等資訊。 引數:-k 以 k 位元組為單位顯示。

總結

在 Linux 平臺下,shell 指令碼監控是一個非常簡單,方便,有效的對伺服器,程序進行監控的方法,對系統開發以及程序維護人員非常有幫助。它不僅可以對上面的資訊進行監控,傳送告警,同時也可以監控程序的日誌等等的資訊,希望本文對大家有幫助。

相關推薦

Shell指令碼實現Linux系統程序資源監控

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

shell指令碼實現linux系統監控

一、系統監控要監控什麼? 硬體 CPU: [[email protected] ~]# top | sed -n '3p' 記憶體: 檢視系統記憶體的使用情況: 硬碟: 檢視磁碟的使用情況 系統 負載: 系統執行時間: 檢視作業系統的版

使用shell 指令碼Linux 系統程序的CPU使用率與記憶體資源進行監控

Shell 簡介 Shell 語言對於接觸 LINUX 的人來說都比較熟悉,它是系統的使用者介面,提供了使用者與核心進行互動操作的一種介面。它接收使用者輸入的命令並把它送入核心去執行。實際上 Shell 是一個命令直譯器,它解釋由使用者輸入的命令並且把它們送到核心。它沒有一般程式語言的“編譯 - 連結 - 

shell指令碼實現相關文字資料夾操作

shell指令碼實現某些文字/檔案和資料夾功能. 資料在指令碼的上層資料夾Data內,在scripts資料夾內執行該指令碼,按格式得到需要的event.cat檔案. 在此做一記錄, 以便以後檢視. #!/bin/bash #以要求格式生成event.cat #在資料檔案上一級目錄的src

Shell指令碼實現Linux回收站功能

在系統運維過程中“Linux系統上常見的誤操作”之首就是刪除rm操作(特別是rm -rf),這些被誤刪的檔案將無法被取回,那麼是否有辦法解決這個問題呢?目前有兩種解決方案: 1. 第一種是如果你在誤刪除檔案以後,若沒有對硬碟做大量的IO(也就是硬碟上存放該被刪除檔案的裝置塊沒被新的資料所覆蓋),那麼

計算Linux系統程序執行緒的CPU及記憶體使用率(c++原始碼)

proc檔案系統下的 /proc/stat, /proc/meminfo, /proc/<pid>/status, /proc/<pid>/stat 總的cpu時間totalCpuTime = user + nice+ system + idle +

Linux 指令碼實現批量新增刪除普通使用者

(1)Linux中用指令碼實現批量新增和刪除普通使用者 https://blog.csdn.net/qq_38038143/article/details/71655771 (2)Linux————Linux下批量建立使用者並設定密碼(shell指令碼) https://blog.csd

Linux系統程式設計——程序執行緒的區別與聯絡

在許多經典的作業系統教科書中,總是把程序定義為程式的執行例項,它並不執行什麼, 只是維護應用程式所需的各種資源,而執行緒則是真正的執行實體。 為了讓程序完成一定的工作,程序必須至少包含一個執行緒。 程序,直觀點說,儲存在硬碟上的程式執行以後,會在記憶體空間裡形成

Shell指令碼實現軟體一鍵安裝自動重啟(一)

前言 在LINUX開發過程中,往往需要對已經開發好的軟體進行打包,一鍵安裝後程序能自動後臺啟動,當程序意外關閉後能自動重啟,本篇來介紹實現過程。 業務分析 對功能進行拆分 1、實現程式後臺執行,掛掉重啟的監聽器指令碼 2、將監聽器指令碼放入開機啟動項 3、實現軟體

LinuxShell指令碼實現批量重新命名資料夾,批量重新命名檔案(讓原本繁重的工作變得簡單)

最近接了個專案,具體做什麼都不說了,其中有個工作就是批量更改資料夾,然後批量更改資料夾下的檔名字,一會兒先貼程式碼,再詳細解釋步驟。 下面是我的簡化版的目錄結構,實際上有上百個。 project dir1 dir1.py dir2

Linux Shell指令碼中單引號(‘)雙引號(“)的區別

在Linux作業系統上編寫Shell指令碼時候,我們是在變數的前面使用$符號來獲取該變數的值,通常在指令碼中使用”$param”這種帶雙引號的格式,但也有出現使用’$param’這種帶引號的使用的場景,首先大家看一段例子: [[email protected] ~]# name=TekTe

Linux shell指令碼開頭#!/bin/bash#!/bin/sh介紹與區別

一直以為在Linux shell指令碼中#都是代表著註釋功能,同樣在指令碼開始的#!/bin/sh也只是告訴使用者這是一個shell指令碼,最近查了下,才發現不是這個意思,分享下。 一、意思 #!/bin/sh是指此指令碼使用/bin/sh來解釋執行,#!是特殊的表示符,其後面跟的是此解釋此指令碼的she

關於linux定時任務與shell指令碼——實現遠端資料庫備份

一、常用的命令如下:1、編輯一個新的crontab任務    crontab -e2、檢視編寫後的crontab任務    crontab -l3、重啟contab任務服務    service crond restart4、檢視contab任務狀態    service c

定時執行Linux shell指令碼實現SFTP定時上傳下載檔案

之所以寫這篇文章,是因為網上很多有關文章亂轉載,crontab 命令的語法都是錯的,都直接轉了,雖然很簡單,但也會浪費時間啊,尤其是對於第一次寫的同學來說。轉入正題一:定時任務(大部分文章出錯的就是這個部分)1.執行命令:crontab -e2.按 i 編輯檔案,新增命令如下

php呼叫shell指令碼(web端客戶端同時實現

想這個問題有一段時間了,一開始想實現的功能是在web端點選一個按鈕,然後liunx主機採集影象,在瀏覽器上顯示。於是自然而然的想到了php呼叫shell指令碼。查了很多資料。實現了。 下面開始講解。本

linux下效能監控shell指令碼實現系列一(伺服器整體效能監控

在實現監控指令碼前,我們先了解下一些已經成型的監控程式,比如大名鼎鼎的nmon。 nmon官網 http://nmon.sourceforge.net/pmwiki.php nmon使用簡單說明 http://www.ibm.com/developerworks/cn/ai

shell學習:Linux系統日誌的相關命令、檔案管理工具

日誌檔案是Linux系統維必不可少的部分,日誌檔案會隨著時間的推移變的越來越大,需要使用一種被稱為輪替的技術來限制日誌的體積,一旦超過了限制的大小,就對它的內容進行抽取,同時將日誌檔案中的舊條目儲存到歸檔檔案中,以便日後的查閱。 logrotate命令 logrotat

linux使用shell指令碼實現自動登入scp傳輸檔案到其他伺服器

執行 sudo yum install expect  安裝自動登入expect工具 我們是配置了多臺伺服器進行控制多臺伺服器的檔案傳輸,使用scp命令進行copy檔案到指定伺服器的指定檔案目錄,一般複製到home目錄因為這個目錄對外有可執行許可權 下面我們看下會用到的檔

編寫shell指令碼檢視linux當前各使用者的cpumemory消耗比例

為了方便自己檢視centOS上的各使用者cpu和記憶體的使用比例,寫了shell指令碼。 viewUsage.sh #!/bin/bash # # view the cpu and memory consumption of each user at the current

shell指令碼實現mysql資料庫表表結構的對比

在專案維護和開發中,經常需要知道兩個資料庫之間有哪些差異,如兩個資料庫中資料表有什麼不同(表的名稱,數量),相同的表字段是否相同(欄位數目,約束,欄位型別,大小等),有各種資料庫管理工具可以實現這一點,但是別人的東西用起來總是沒有自己的順手(比如有的工具直接生成