如何用bash shell 指令碼監控 Linux記憶體、磁碟和 CPU?

大雄45發表於2022-05-13
導讀 監控我們的環境對於伺服器運維來說至關重要,尤其是在部署新的應用程式時。如今,公司每天都使用開源解決方案來監控系統資源。但是,當出於測試的目的來監控一定時間時,bash  會派上用場。

在本教程中,我們將編寫一個 bash    ,它將輸出一個三列表,來顯示我們機器上的記憶體、磁碟和 CPU 的百分比。

如何用bash shell 指令碼監控 Linux記憶體、磁碟和 CPU?如何用bash shell 指令碼監控 Linux記憶體、磁碟和 CPU?

讓我們開始吧!

該指令碼基本上由三個主要部分組成:

監控記憶體:
free -m | awk 'NR==2{printf "%.2f%%\t\t", $3*100/$2 }'
9.24%

free -m 是用於顯示已使用和空閒記憶體的 ,輸出如下:

[root@localhost tmp]# free -m
             total       used       free     shared    buffers     cached
Mem:           996         92        904          0         11         31
-/+ buffers/cache:         49        947
Swap:         1583          0       1583

但是,我們需要從上面的輸出中獲取第二行的總記憶體和已用記憶體。我們可以使用 AWK 來從給定輸出中提取資料。

AWK 是一種用於文字處理和資料提取的程式語言。它是大多數 UNIX 系統的標準功能。awk ‘NR==2’ 從第二行提取資料。$3 和 $2 分別充當已用量和總量。

監控磁碟
df -h | awk '$NF=="/"{printf "%s\t\t", $5}'
7%

第二個 輸出使用的磁碟百分比。df -h 輸出與磁碟使用情況和分割槽相關的資料。

[root@localhost tmp]# df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root   14G  814M   12G   7% /
tmpfs                         499M     0  499M   0% /dev/shm
/dev/sda1                     485M   32M  428M   7% /boot

awk $NF 輸出欄位數。但是,df -h | awk '$NF=="/" 將轉到包含字元 / 的那一行。$5 將從該行中選擇第 5 個欄位。這可確保該命令能夠提取正確的磁碟使用百分比(在我們的示例中為 %7)。

監控 CPU
top -bn1 | grep load | awk '{printf "%.2f%%\t\t\n", $(NF-2)}'

top -bn1 命令將只執行一次 top 命令(n1 = 一次迭代),當我們想在 bash 指令碼中使用 top 或將其資料輸出到檔案時使用可以使用 -b 選項。

grep load 將輸出包含字串 load 的行。$(NF-2) 將計算該行上的欄位數並減 2。

[root@localhost tmp]# top -bn1 | grep load
top - 19:31:25 up  1:47,  1 user,  load average: 0.00, 0.00, 0.00

在瀏覽完 bash 指令碼的基本部分之後,我們需要將這些命令儲存到變數 MEMORY、DISK 和 CPU 中:

MEMORY=$(free -m | awk 'NR==2{printf "%.2f%%\t\t", $3*100/$2 }')
DISK=$(df -h | awk '$NF=="/"{printf "%s\t\t", $5}')
CPU=$(top -bn1 | grep load | awk '{printf "%.2f%%\t\t\n", $(NF-2)}')

我們需要指令碼執行一段時間(比如,一個小時)。為了做到這一點,我們需要使用 while do 迴圈,每次迴圈後延遲 x 秒(取決於您的測試):

end=$((SECONDS+3600))
while [ $SECONDS -lt $end ]; do
echo "$MEMORY$DISK$CPU"
sleep 5
done

為了在一定時間內執行一次迴圈,我們可以定義一個變數 $end,它從 bash 指令碼開始的時間開始計算當前的秒數,因此是 SECONDS,並在當前秒數上加上一個數字。所以一個小時就是 3600 秒。

上述程式碼片段的第二行指出,只要$SECONDS(當前秒數)小於 $SECONDS+3600,while 迴圈就會繼續執行。因此,我們定義了迴圈的開始時間和結束時間,以及將每個迴圈暫停 5 秒的睡眠時間。迴圈內部是每 5 秒將那三個變數分配一次新值,以及將輸出三個資源使用情況的 echo "$MEMORY$DISK$CPU"。

完整程式碼如下:

#! /bin/bash
printf "Memory\t\tDisk\t\tCPU\n"
end=$((SECONDS+3600))
while [ $SECONDS -lt $end ]; do
MEMORY=$(free -m | awk 'NR==2{printf "%.2f%%\t\t", $3*100/$2 }')
DISK=$(df -h | awk '$NF=="/"{printf "%s\t\t", $5}')
CPU=$(top -bn1 | grep load | awk '{printf "%.2f%%\t\t\n", $(NF-2)}')
echo "$MEMORY$DISK$CPU"
sleep 5
done

上面的程式碼將輸出以下內容:

[root@localhost tmp]# ./stats.sh
Memory Disk CPU
9.34% 7% 0.00%
9.34% 7% 0.00%
9.34% 7% 0.00%
9.34% 7% 0.00%
^C[root@localhost tmp]#

您始終可以將資料輸出到日誌檔案:

[root@localhost tmp]# ./stats.sh >> log.txt
Stress 測試

如何用bash shell 指令碼監控 Linux記憶體、磁碟和 CPU?如何用bash shell 指令碼監控 Linux記憶體、磁碟和 CPU?

由於機器上幾乎沒有任何負載,我們可以使用 stress 來使 CPU 和記憶體負載一段時間。

使用以下命令安裝(在   上):

[root@localhost tmp]# yum install stress
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Determining fastest mirrors
epel/metalink                                                               | 4.2 kB     00:00     
 * base: ba.mirror.garr.it
 * epel: ftp.riken.jp
 * extras: centos.fastbull.org
 * updates: centos.fastbull.org
base                                                                        | 3.7 kB     00:00     
epel                                                                        | 4.3 kB     00:00     
epel/primary_db                                                             | 5.9 MB     00:37     
extras                                                                      | 3.4 kB     00:00     
extras/primary_db                                                           |  37 kB     00:00     
updates                                                                     | 3.4 kB     00:00     
updates/primary_db                                                          | 5.2 MB     00:30     
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package stress.x86_64 0:1.0.4-4.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
===================================================================================================
 Package               Arch                  Version                     Repository           Size
===================================================================================================
Installing:
 stress                x86_64                1.0.4-4.el6                 epel                 36 k
Transaction Summary
===================================================================================================
Install       1 Package(s)
Total download size: 36 k
Installed size: 89 k
Is this ok [y/N]: y
Downloading Packages:
stress-1.0.4-4.el6.x86_64.rpm                                               |  36 kB     00:01     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : stress-1.0.4-4.el6.x86_64                                                       1/1 
  Verifying  : stress-1.0.4-4.el6.x86_64                                                       1/1 
Installed:
  stress.x86_64 0:1.0.4-4.el6                                                                      
Complete!

現在我們可以使用命令 stress 來負載我們的機器。例如,透過指定兩個 CPU 密集型程式、一個 I/O 密集型程式和一個記憶體分配器程式,對系統施加 4 個平均負載,如下所示。以下壓力測試將執行 1 小時。

[root@localhost tmp]# stress -c 2 -i 1 -m 1 --vm-bytes 128M -t 3600s
stress: info: [1574] dispatching hogs: 2 cpu, 1 io, 1 vm, 0 hdd
stress: info: [1574] successful run completed in 3600s
[root@localhost tmp]# ./stats.sh 
Memory  Disk  CPU
20.48%  7%  1.21%  
20.48%  7%  1.02%  
20.48%  7%  0.94%  
21.89%  7%  1.18%  
20.68%  7%  1.41%  
22.09%  7%  1.62%  
24.10%  7%  1.81%  
24.90%  7%  1.98%  
32.93%  7%  2.14%  
30.32%  7%  2.29%  
20.58%  7%  2.63%  
27.91%  7%  2.82%  
20.48%  7%  2.59%  
20.48%  7%  2.38%  
20.48%  7%  2.19%  
20.48%  7%  2.02%  
20.48%  7%  1.86%

 

關於如何為所有系統管理員建立一個非常容易且有用的 bash 指令碼的教程到此結束。

原文來自:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2893903/,如需轉載,請註明出處,否則將追究法律責任。

相關文章