如何用 10 行 bash shell 指令碼監控 Linux?
點選進入“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 指令碼的基本部分之後,我們需要將這些命令儲存到變數 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
上面的程式碼將輸出以下內容:
[[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資料“
免費獲取進階
面試、文件、影片資源
點選“檢視原文”獲取更多
- 你會使用 Linux 編輯器 Vim 嗎?
- php實現圖書管理系統詳細介紹
- 面試官問:Redis 快取都有哪些異常,各自有哪些解決方案
- 面試被問到:關於php檔案包含你瞭解多少?
- 一張小圖看盡 Nginx
- php快速搭建swoole玩轉協程
- Laravel 使用Guzzle執行HTTP請求
- PHP中的異常處理機制
- 基於redis的分散式鎖詳解
- 如何通過查原始碼的方式解決程式設計中遇到的問題?
- PHP高併發商品秒殺問題的解決方案
- Thinkphp6專案基本操作(中介軟體處理登入流程)
- PHP實現非同步延遲訊息佇列(庫存歸還)
- php捕捉Warning、Notice錯誤
- 利用PHP的POST臨時檔案機制實現任意檔案上傳
- php Carbon 時間處理類 超詳細講解(一)
- 如何用 10 行 bash shell 指令碼監控 Linux?
- PDO方式連線資料庫、PHP連線資料庫
- php雪花演算法SnowFlake生成唯一ID
- 淺述 Docker 的容器編排