如何用 10 行 bash shell 腳本監(jiān)控 Linux?
在下方公眾號后臺回復(fù):JGNB,可獲取杰哥原創(chuàng)的 PDF 手冊。
監(jiān)控我們的環(huán)境對于服務(wù)器運維來說至關(guān)重要,尤其是在部署新的應(yīng)用程序時。如今,公司每天都使用開源解決方案來監(jiān)控系統(tǒng)資源。但是,當(dāng)出于測試的目的來監(jiān)控一定時間時,bash 腳本會派上用場。
在本教程中,我們將編寫一個 bash shell 腳本,它將輸出一個三列表,來顯示我們機器上的內(nèi)存、磁盤和 CPU 的百分比。
讓我們開始吧!
該腳本基本上由三個主要部分組成:
監(jiān)控內(nèi)存
free?-m?|?awk?'NR==2{printf?"%.2f%%\t\t",?$3*100/$2?}'
9.24%
free -m是用于顯示已使用和空閑內(nèi)存的命令,輸出如下:
[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
但是,我們需要從上面的輸出中獲取第二行的總內(nèi)存和已用內(nèi)存。我們可以使用 AWK 來從給定輸出中提取數(shù)據(jù)。
AWK 是一種用于文本處理和數(shù)據(jù)提取的編程語言。它是大多數(shù) UNIX 系統(tǒng)的標(biāo)準(zhǔn)功能。awk ‘NR==2’從第二行提取數(shù)據(jù)。$3和$2分別充當(dāng)已用量和總量。
監(jiān)控磁盤
df?-h?|?awk?'$NF=="/"{printf?"%s\t\t",?$5}'
7%
第二個命令輸出使用的磁盤百分比。df -h輸出與磁盤使用情況和分區(qū)相關(guān)的數(shù)據(jù)。
[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輸出字段數(shù)。但是,df -h | awk '$NF=="/"將轉(zhuǎn)到包含字符/的那一行。$5將從該行中選擇第 5 個字段。這可確保該命令能夠提取正確的磁盤使用百分比(在我們的示例中為 %7)。
監(jiān)控 CPU
top?-bn1?|?grep?load?|?awk?'{printf?"%.2f%%\t\t\n",?$(NF-2)}'
top -bn1命令將只執(zhí)行一次top命令(n1= 一次迭代),當(dāng)我們想在 bash 腳本中使用top或?qū)⑵鋽?shù)據(jù)輸出到文件時使用可以使用-b選項。
grep load將輸出包含字符串load的行。$(NF-2)將計算該行上的字段數(shù)并減 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循環(huán),每次循環(huán)后延遲 x 秒(取決于您的測試):
end=$((SECONDS+3600))
while?[?$SECONDS?-lt?$end?];?do
echo?"$MEMORY$DISK$CPU"
sleep?5
done
為了在一定時間內(nèi)運行一次循環(huán),我們可以定義一個變量 $end,它從 bash 腳本開始的時間開始計算當(dāng)前的秒數(shù),因此是SECONDS,并在當(dāng)前秒數(shù)上加上一個數(shù)字。所以一個小時就是 3600 秒。
上述代碼片段的第二行指出,只要$SECONDS(當(dāng)前秒數(shù))小于$SECONDS+3600,while循環(huán)就會繼續(xù)執(zhí)行。因此,我們定義了循環(huán)的開始時間和結(jié)束時間,以及將每個循環(huán)暫停 5 秒的睡眠時間。循環(huán)內(nèi)部是每 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
上面的代碼將輸出以下內(nèi)容:
[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]#
您始終可以將數(shù)據(jù)輸出到日志文件:
[root@localhost?tmp]#?./stats.sh?>>?log.txt
Stress 測試

由于機器上幾乎沒有任何負(fù)載,我們可以使用stress來使 CPU 和內(nèi)存負(fù)載一段時間。
使用以下命令安裝(在 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!
現(xiàn)在我們可以使用命令 stress 來負(fù)載我們的機器。例如,通過指定兩個 CPU 密集型進(jìn)程、一個 I/O 密集型進(jìn)程和一個內(nèi)存分配器進(jìn)程,對系統(tǒng)施加 4 個平均負(fù)載,如下所示。以下壓力測試將運行 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%
關(guān)于如何為所有系統(tǒng)管理員創(chuàng)建一個非常容易且有用的 bash 腳本的教程到此結(jié)束。
鏈接:https://kloudvm.medium.com/simple-bash-script-to-monitor-cpu-memory-and-disk-usage-on-linux-in-10-lines-of-code-e4819fe38bf1
來自:馬哥Linux運維
作者:子沐愛掃地(譯)
推薦閱讀

