當前位置: 妍妍網 > 碼農

教你用 10 行 shell 指令碼搞定監控 Linux !

2024-05-29碼農

戳下方名片 ,關註並 星標

回復「 1024 」獲取 2TB 學習資源!

👉 體系化學習:

特色專欄

/ /

/ /

/ /

/ /

/ /

大家好,我是民工哥!

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

在本教程中,我們將編寫一個 bash shell 指令碼,它將輸出一個三列表,來顯示我們機器上的記憶體、磁盤和 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 測試

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

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

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

連結:https://kloudvm.medium.com/simple-bash-script-to-monitor-cpu-memory-and-disk-usage-on-linux-in-10-lines-of-code-e4819fe38bf1

👍 如果你喜歡這篇文章,請點贊並分享給你的朋友!

公眾號讀者專屬技術群

構建高品質的技術交流社群,歡迎從事後端開發、運維技術進群( 備註崗位,已在技術交流群的請勿重復添加微信好友 )。主要以技術交流、內推、行業探討為主,請文明發言。 廣告人士勿入,切勿輕信私聊,防止被騙。

掃碼加我好友,拉你進群

PS:因為公眾號平台更改了推播規則,如果不想錯過內容,記得讀完點一下 在看 ,加個 星標 ,這樣每次新文章推播才會第一時間出現在你的訂閱列表裏。 在看 支持我們吧!