监控我们的环境对于服务器运维来说至关重要,尤其是在部署新的应用程序时。如今,公司每天都使用开源解决方案来监控系统资源。但是,当出于测试的目的来监控一定时间时,bash 脚本会派上用场。
在本教程中,我们将编写一个 bash shell 脚本,它将输出一个三列表,来显示我们机器上的内存、磁盘和 CPU 的百分比。
让我们开始吧!
该脚本基本上由三个主要部分组成:
监控内存
free-m|awk'NR==2{printf"%.2f%% ",$3*100/$2}' 9.24%
free -m是用于显示已使用和空闲内存的命令,输出如下:
[root@localhosttmp]#free-m totalusedfreesharedbufferscached Mem:9969290401131 -/+buffers/cache:49947 Swap:158301583
但是,我们需要从上面的输出中获取第二行的总内存和已用内存。我们可以使用 AWK 来从给定输出中提取数据。
AWK 是一种用于文本处理和数据提取的编程语言。它是大多数 UNIX 系统的标准功能。awk ‘NR==2’从第二行提取数据。$3和$2分别充当已用量和总量。
监控磁盘
df-h|awk'$NF=="/"{printf"%s ",$5}' 7%
第二个命令输出使用的磁盘百分比。df -h输出与磁盘使用情况和分区相关的数据。
[root@localhosttmp]#df-h FilesystemSizeUsedAvailUse%Mountedon /dev/mapper/VolGroup-lv_root14G814M12G7%/ tmpfs499M0499M0%/dev/shm /dev/sda1485M32M428M7%/boot
awk $NF输出字段数。但是,df -h | awk '$NF=="/"将转到包含字符/的那一行。$5将从该行中选择第 5 个字段。这可确保该命令能够提取正确的磁盘使用百分比(在我们的示例中为 %7)。
监控 CPU
top-bn1|grepload|awk'{printf"%.2f%% ",$(NF-2)}'
top -bn1命令将只执行一次top命令(n1= 一次迭代),当我们想在 bash 脚本中使用top或将其数据输出到文件时使用可以使用-b选项。
grep load将输出包含字符串load的行。$(NF-2)将计算该行上的字段数并减 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)}')
我们需要脚本运行一段时间(比如,一个小时)。为了做到这一点,我们需要使用while do循环,每次循环后延迟 x 秒(取决于您的测试):
end=$((SECONDS+3600)) while[$SECONDS-lt$end];do echo"$MEMORY$DISK$CPU" sleep5 done
为了在一定时间内运行一次循环,我们可以定义一个变量 $end,它从 bash 脚本开始的时间开始计算当前的秒数,因此是SECONDS,并在当前秒数上加上一个数字。所以一个小时就是 3600 秒。
上述代码片段的第二行指出,只要$SECONDS(当前秒数)小于$SECONDS+3600,while循环就会继续执行。因此,我们定义了循环的开始时间和结束时间,以及将每个循环暂停 5 秒的睡眠时间。循环内部是每 5 秒将那三个变量分配一次新值,以及将输出三个资源使用情况的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
上面的代码将输出以下内容:
[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]#
您始终可以将数据输出到日志文件:
[root@localhosttmp]#./stats.sh>>log.txt
Stress 测试
由于机器上几乎没有任何负载,我们可以使用stress来使 CPU 和内存负载一段时间。
使用以下命令安装(在 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!
现在我们可以使用命令 stress 来负载我们的机器。例如,通过指定两个 CPU 密集型进程、一个 I/O 密集型进程和一个内存分配器进程,对系统施加 4 个平均负载,如下所示。以下压力测试将运行 1 小时。
[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%
关于如何为所有系统管理员创建一个非常容易且有用的 bash 脚本的教程到此结束。
-
Linux
+关注
关注
87文章
11292浏览量
209322 -
开源
+关注
关注
3文章
3309浏览量
42471 -
Shell
+关注
关注
1文章
365浏览量
23354 -
脚本
+关注
关注
1文章
389浏览量
14858 -
Bash
+关注
关注
0文章
57浏览量
10179
原文标题:如何用 10 行 bash shell 脚本监控 Linux?
文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论