如何用 10 行 bash shell 指令碼監控 Linux?

語言: CN / TW / HK

點選進入“PHP開源社群”    

免費獲取進階面試、文件、影片資源

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

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

讓我們開始吧!

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

監控記憶體

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

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

[[email protected] 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 輸出與磁碟使用情況和分割槽相關的資料。

[[email protected] 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。

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

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

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+3600while 迴圈就會繼續執行。因此,我們定義了迴圈的開始時間和結束時間,以及將每個迴圈暫停 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

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

[[email protected] 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[[email protected] tmp]#

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

[[email protected] tmp]# ./stats.sh >> log.txt

Stress 測試

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

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

[[email protected] 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 小時。

[[email protected] 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
[[email protected] 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 指令碼的教程到此結束。

*宣告:本文於網路整理,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。

END

PHP開源社群

掃描關注  進入”PHP資料“

免費獲取進階

面試、文件、影片資源

點選“檢視原文”獲取更多