如何用bash shell 指令碼監控 Linux記憶體、磁碟和 CPU?
導讀 | 監控我們的環境對於伺服器運維來說至關重要,尤其是在部署新的應用程式時。如今,公司每天都使用開源解決方案來監控系統資源。但是,當出於測試的目的來監控一定時間時,bash 會派上用場。 |
在本教程中,我們將編寫一個 bash ,它將輸出一個三列表,來顯示我們機器上的記憶體、磁碟和 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)。
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 來使 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PowerShell 指令碼來監控 CPU、記憶體和磁碟使用情況:指令碼記憶體
- 【shell】磁碟監控指令碼指令碼
- 用 Bash 指令碼監控 Linux 上的記憶體使用情況指令碼Linux記憶體
- 利用 Shell 指令碼來監控 Linux 系統的記憶體指令碼Linux記憶體
- 記憶體CPU監控記憶體
- nagios監控linux主機監控記憶體指令碼iOSLinux記憶體指令碼
- RabbitMQ - 記憶體磁碟監控MQ記憶體
- shell指令碼:自動記憶體監控及日誌備份指令碼記憶體
- 監控磁碟使用率的shell指令碼指令碼
- Shell----監控CPU/記憶體/負載高時的程式記憶體負載
- linux實現shell指令碼監控磁碟記憶體達到閾值時清理catalina.out日誌Linux指令碼記憶體
- nagios-建立記憶體監控指令碼iOS記憶體指令碼
- 利用Bash指令碼監控Linux伺服器的記憶體使用情況的相關資料指令碼Linux伺服器記憶體
- Linux中顯示記憶體和CPU使用率最高的程式的SHELL指令碼例子Linux記憶體指令碼
- 監控cpu與memory指令碼指令碼
- shell採集系統cpu 記憶體 磁碟 網路資訊記憶體
- 如何使用 Bash 指令碼從 SAR 報告中獲取 CPU 和記憶體使用情況指令碼記憶體
- python利用WMI等監控獲取windows狀態如CPU、記憶體、硬碟等資訊PythonWindows記憶體硬碟
- 用於自動監控磁碟使用情況的 Shell 指令碼指令碼
- 用 Linux Shell 指令碼來監控磁碟使用情況併傳送郵件Linux指令碼
- stap監控cpu指令碼小結指令碼
- linux檢視 CPU,記憶體,網路流量和磁碟 I/OLinux記憶體
- Docker之CPU和記憶體磁碟設定(八)Docker記憶體
- shell和bash指令碼命令學習指令碼
- oracle會話監控shell指令碼Oracle會話指令碼
- Shell 系統資訊監控指令碼指令碼
- 在 Linux 上用 Bash 指令碼監控 messages 日誌Linux指令碼
- 使用 Shell 指令碼監控 Linux 系統程式資源指令碼Linux
- Linux-記憶體和磁碟管理Linux記憶體
- AIX 記憶體監控AI記憶體
- Solaris記憶體監控記憶體
- 透過shell指令碼監控oracle session指令碼OracleSession
- 常用的主機監控shell指令碼指令碼
- 通過shell指令碼監控oracle session指令碼OracleSession
- 使用Shell指令碼對Linux系統和程式資源進行監控指令碼Linux
- Android 分割槽和記憶體監控Android記憶體
- linux aix檢視CPU和記憶體LinuxAI記憶體
- 【SHELL】Linux系統 Oracle例項監控、重啟 簡易Shell指令碼LinuxOracle指令碼