監(jiān)控我們的環(huán)境對(duì)于服務(wù)器運(yùn)維來(lái)說(shuō)至關(guān)重要,尤其是在部署新的應(yīng)用程序時(shí)。如今,公司每天都使用開(kāi)源解決方案來(lái)監(jiān)控系統(tǒng)資源。但是,當(dāng)出于測(cè)試的目的來(lái)監(jiān)控一定時(shí)間時(shí),bash 腳本會(huì)派上用場(chǎng)。
在本教程中,我們將編寫(xiě)一個(gè) bash shell 腳本,它將輸出一個(gè)三列表,來(lái)顯示我們機(jī)器上的內(nèi)存、磁盤(pán)和 CPU 的百分比。
讓我們開(kāi)始吧!
該腳本基本上由三個(gè)主要部分組成:
監(jiān)控內(nèi)存
free-m|awk'NR==2{printf"%.2f%% ",$3*100/$2}' 9.24%
free -m是用于顯示已使用和空閑內(nèi)存的命令,輸出如下:
[root@localhosttmp]#free-m totalusedfreesharedbufferscached Mem:9969290401131 -/+buffers/cache:49947 Swap:158301583
但是,我們需要從上面的輸出中獲取第二行的總內(nèi)存和已用內(nèi)存。我們可以使用 AWK 來(lái)從給定輸出中提取數(shù)據(jù)。
AWK 是一種用于文本處理和數(shù)據(jù)提取的編程語(yǔ)言。它是大多數(shù) UNIX 系統(tǒng)的標(biāo)準(zhǔn)功能。awk ‘NR==2’從第二行提取數(shù)據(jù)。$3和$2分別充當(dāng)已用量和總量。
監(jiān)控磁盤(pán)
df-h|awk'$NF=="/"{printf"%s ",$5}' 7%
第二個(gè)命令輸出使用的磁盤(pán)百分比。df -h輸出與磁盤(pán)使用情況和分區(qū)相關(guān)的數(shù)據(jù)。
[root@localhosttmp]#df-h FilesystemSizeUsedAvailUse%Mountedon /dev/mapper/VolGroup-lv_root14G814M12G7%/ tmpfs499M0499M0%/dev/shm /dev/sda1485M32M428M7%/boot
awk $NF輸出字段數(shù)。但是,df -h | awk '$NF=="/"將轉(zhuǎn)到包含字符/的那一行。$5將從該行中選擇第 5 個(gè)字段。這可確保該命令能夠提取正確的磁盤(pán)使用百分比(在我們的示例中為 %7)。
監(jiān)控 CPU
top-bn1|grepload|awk'{printf"%.2f%% ",$(NF-2)}'
top -bn1命令將只執(zhí)行一次top命令(n1= 一次迭代),當(dāng)我們想在 bash 腳本中使用top或?qū)⑵鋽?shù)據(jù)輸出到文件時(shí)使用可以使用-b選項(xiàng)。
grep load將輸出包含字符串load的行。$(NF-2)將計(jì)算該行上的字段數(shù)并減 2。
[root@localhosttmp]#top-bn1|grepload top-19:31:25up1:47,1user,loadaverage:0.00,0.00,0.00
在瀏覽完 bash 腳本的基本部分之后,我們需要將這些命令保存到變量MEMORY、DISK和CPU中:
MEMORY=$(free-m|awk'NR==2{printf"%.2f%% ",$3*100/$2}') DISK=$(df-h|awk'$NF=="/"{printf"%s ",$5}') CPU=$(top-bn1|grepload|awk'{printf"%.2f%% ",$(NF-2)}')
我們需要腳本運(yùn)行一段時(shí)間(比如,一個(gè)小時(shí))。為了做到這一點(diǎn),我們需要使用while do循環(huán),每次循環(huán)后延遲 x 秒(取決于您的測(cè)試):
end=$((SECONDS+3600)) while[$SECONDS-lt$end];do echo"$MEMORY$DISK$CPU" sleep5 done
為了在一定時(shí)間內(nèi)運(yùn)行一次循環(huán),我們可以定義一個(gè)變量 $end,它從 bash 腳本開(kāi)始的時(shí)間開(kāi)始計(jì)算當(dāng)前的秒數(shù),因此是SECONDS,并在當(dāng)前秒數(shù)上加上一個(gè)數(shù)字。所以一個(gè)小時(shí)就是 3600 秒。
上述代碼片段的第二行指出,只要$SECONDS(當(dāng)前秒數(shù))小于$SECONDS+3600,while循環(huán)就會(huì)繼續(xù)執(zhí)行。因此,我們定義了循環(huán)的開(kāi)始時(shí)間和結(jié)束時(shí)間,以及將每個(gè)循環(huán)暫停 5 秒的睡眠時(shí)間。循環(huán)內(nèi)部是每 5 秒將那三個(gè)變量分配一次新值,以及將輸出三個(gè)資源使用情況的echo "$MEMORY$DISK$CPU"。
完整代碼如下:
#!/bin/bash printf"Memory Disk CPU " end=$((SECONDS+3600)) while[$SECONDS-lt$end];do MEMORY=$(free-m|awk'NR==2{printf"%.2f%% ",$3*100/$2}') DISK=$(df-h|awk'$NF=="/"{printf"%s ",$5}') CPU=$(top-bn1|grepload|awk'{printf"%.2f%% ",$(NF-2)}') echo"$MEMORY$DISK$CPU" sleep5 done
上面的代碼將輸出以下內(nèi)容:
[root@localhosttmp]#./stats.sh MemoryDiskCPU 9.34%7%0.00% 9.34%7%0.00% 9.34%7%0.00% 9.34%7%0.00% ^C[root@localhosttmp]#
您始終可以將數(shù)據(jù)輸出到日志文件:
[root@localhosttmp]#./stats.sh>>log.txt
Stress 測(cè)試
由于機(jī)器上幾乎沒(méi)有任何負(fù)載,我們可以使用stress來(lái)使 CPU 和內(nèi)存負(fù)載一段時(shí)間。
使用以下命令安裝(在 CentOS 上):
[root@localhosttmp]#yuminstallstress Failedtosetlocale,defaultingtoC Loadedplugins:fastestmirror Determiningfastestmirrors epel/metalink|4.2kB00:00 *base:ba.mirror.garr.it *epel:ftp.riken.jp *extras:centos.fastbull.org *updates:centos.fastbull.org base|3.7kB00:00 epel|4.3kB00:00 epel/primary_db|5.9MB00:37 extras|3.4kB00:00 extras/primary_db|37kB00:00 updates|3.4kB00:00 updates/primary_db|5.2MB00:30 SettingupInstallProcess ResolvingDependencies -->Runningtransactioncheck --->Packagestress.x86_640:1.0.4-4.el6willbeinstalled -->FinishedDependencyResolution DependenciesResolved =================================================================================================== PackageArchVersionRepositorySize =================================================================================================== Installing: stressx86_641.0.4-4.el6epel36k TransactionSummary =================================================================================================== Install1Package(s) Totaldownloadsize:36k Installedsize:89k Isthisok[y/N]:y DownloadingPackages: stress-1.0.4-4.el6.x86_64.rpm|36kB00:01 Runningrpm_check_debug RunningTransactionTest TransactionTestSucceeded RunningTransaction Installing:stress-1.0.4-4.el6.x86_641/1 Verifying:stress-1.0.4-4.el6.x86_641/1 Installed: stress.x86_640:1.0.4-4.el6 Complete!
現(xiàn)在我們可以使用命令 stress 來(lái)負(fù)載我們的機(jī)器。例如,通過(guò)指定兩個(gè) CPU 密集型進(jìn)程、一個(gè) I/O 密集型進(jìn)程和一個(gè)內(nèi)存分配器進(jìn)程,對(duì)系統(tǒng)施加 4 個(gè)平均負(fù)載,如下所示。以下壓力測(cè)試將運(yùn)行 1 小時(shí)。
[root@localhosttmp]#stress-c2-i1-m1--vm-bytes128M-t3600s stress:info:[1574]dispatchinghogs:2cpu,1io,1vm,0hdd stress:info:[1574]successfulruncompletedin3600s [root@localhosttmp]#./stats.sh MemoryDiskCPU 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)建一個(gè)非常容易且有用的 bash 腳本的教程到此結(jié)束。
-
Linux
+關(guān)注
關(guān)注
87文章
11509瀏覽量
213687 -
開(kāi)源
+關(guān)注
關(guān)注
3文章
3676瀏覽量
43806 -
Shell
+關(guān)注
關(guān)注
1文章
372瀏覽量
24202 -
腳本
+關(guān)注
關(guān)注
1文章
398瀏覽量
28451 -
Bash
+關(guān)注
關(guān)注
0文章
57瀏覽量
10463
原文標(biāo)題:如何用 10 行 bash shell 腳本監(jiān)控 Linux?
文章出處:【微信號(hào):良許Linux,微信公眾號(hào):良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
只需10行腳本就可監(jiān)控你的操作系統(tǒng)?
如何在bash shell腳本中使用變量

Linux Shell腳本入門(mén)到實(shí)戰(zhàn)詳解
Linux_Bash腳本編程大全
linux shell 腳本入門(mén)
每個(gè)Linux用戶都需要知道的重要Bash shell變量
Linux Shell腳本經(jīng)典案例分享

BASH shell腳本篇—條件命令

BASH shell腳本篇—函數(shù)
BASH shell腳本篇—文件處理介紹
Shell腳本檢查工具ShellCheck介紹

Linux從零到精通:最簡(jiǎn)單的Shell腳本入門(mén)教程

評(píng)論