当前位置: 首页 > 科技观察

如何用十行bashshell脚本监控Linux?

时间:2023-03-19 15:54:53 科技观察

监控我们的环境对于服务器操作至关重要,尤其是在部署新应用程序时。今天的公司每天都使用开源解决方案来监控系统资源。但是,在出于测试目的监控一定时间时,bash脚本会派上用场。在本教程中,我们将编写一个bashshell脚本,该脚本将输出一个三列列表,显示我们机器上的内存、磁盘和CPU百分比。开始吧!该脚本基本上由三个主要部分组成:1.监控内存:free-m|awk'NR==2{printf"%.2f%%\t\t",$3*100/$2}'9.24%free-m是一个用于显示已用和空闲内存的命令,输出如下:[root@localhosttmp]#free-mtotalusedfreesharedbufferscachedMem:9969290401131-/+buffers/cache:49947Swap:158301583但是,我们需要从上面第二行获取总内存和已用内存。我们可以使用AWK从给定的输出中提取数据。AWK是一种用于文本处理和数据提取的编程语言。它是大多数UNIX系统的标准功能。awk'NR==2'从第二行提取数据。$3和$2分别为已使用金额和总金额。monitordiskdf-h|awk'$NF=="/"{printf"%s\t\t",$5}'7%第二个命令输出磁盘使用百分比。df-h输出与磁盘使用和分区相关的数据。[root@localhosttmp]#df-hFilesystemSizeUsedAvailUse%Mountedon/dev/mapper/VolGroup-lv_root14G814M12G7%/tmpfs499M0499M0%/dev/shm/dev/sda1485M32M428M7%/bootawk$NF输出字段编号。然而,df-h|awk'$NF=="/"将转到包含字符/的行。$5将从行中选择第5个字段。这确保该命令提取正确的磁盘使用百分比(在我们的示例中为%7)。监控CPUtop-bn1|grepload|awk'{printf"%.2f%%\t\t\n",$(NF-2)}'top-bn1命令只会执行一次top命令(n1=一次迭代),当我们想在bash脚本中使用top或将其数据输出到文件时,我们可以使用-b选项。grepload将输出包含字符串load的行。$(NF-2)会统计行中的字段数,减去2。[root@localhosttmp]#top-bn1|greploadtop-19:31:25up1:47,1user,loadaverage: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|grepload|awk'{printf"%.2f%%\t\t\n",$(NF-2)}')我们需要脚本运行一定的时间(比如说,一个小时)。为了做到这一点,我们需要使用一个whiledo循环,每次循环后延迟x秒(取决于您的测试):end=$((SECONDS+3600))while[$SECONDS-lt$end];doecho"$MEMORY$DISK$CPU"sleep5done为了让一个循环运行一定的时间,我们可以定义一个变量$end,它统计当前从bash脚本开始时间算起的秒数,SECONDS也是如此,并向当前秒数添加一个数字。所以一个小时是3600秒。上面代码片段的第二行表明,只要$SECONDS(当前秒数)小于$SECONDS+3600,while循环就会继续执行。所以我们定义了循环的开始时间和结束时间,以及暂停每个循环5秒的休眠时间。循环内部是一个echo"$MEMORY$DISK$CPU",每5秒就会给那三个变量赋新值,并输出这三个资源的使用情况。完整代码如下:#!/bin/bashprintf"Memory\t\tDisk\t\tCPU\n"end=$((SECONDS+3600))while[$SECONDS-lt$end];doMEMORY=$(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|grepload|awk'{printf"%.2f%%\t\t\n",$(NF-2)}')echo"$MEMORY$DISK$CPU"sleep5done上面的代码会输出如下:[root@localhosttmp]#./stats.shMemoryDiskCPU9.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来加载CPU和内存一段时间。使用以下指令安装(在CentOS上):[root@localhosttmp]#yuminstallstressFailedtosetlocale,defaultingtoCLoadedplugins:fastestmirrorDeterminingfastestmirrorsepel/metalink|4.2kB00:00*base:ba.mirror.garr.it*epel:ftp.riken.jp*extras:centos.fastbull.org*更新:centos.fastbull.orgbase|3.7kB00:00epel|4.3kB00:00epel/primary_db|5.9MB00:37extras|3.4kB00:00extras/primary_db|37kB00:00更新|3.4kB00:00更新/primary_db|5.2MB00:30SettingupInstallProcessResolvingDependencies-->Runningtransactioncheck--->Packagestress.x86_640:1.0.4-4.el6willbeinstalled-->FinishedDependencyResolutionDependenciesResolved====================================================================================================PackageArchVersionRepositorySize=================================================================================================安装:stressx86_641.0.4-4.el6epel36kTransactionSummary==================================================================================================Install1Package(s)Totaldownloadsize:36kInstalledsize:89kIsthisok[y/N]:yDownloadingPackages:stress-1.0.4-4.el6.x86_64.rpm|36kB00:01Runningrpm_check_debugRunningTransactionTestTransactionTestSucceededRunningTransactionInstalling:stress-1.0.4-4.el6.x86_641/1Verifying:stress-1.0.4-4.el6.x86_641/1Installed:stress.x86_640:1.0.4-4.el6Complete!现在我们可以使用命令加载我们的机器,例如,通过指定两个CPU密集型进程、一个I/O密集型进程和一个内存分配器进程,对系统施加4个负载平均,如下所示。以下压力测试将运行1小时。[root@localhosttmp]#stress-c2-i1-m1--vm-bytes128M-t3600sstress:info:[1574]dispatchinghogs:2cpu,1io,1vm,0hddstress:info:[1574]successfulrunco??mpletedin3600s[root@localhosttmp]#./stats.shMemoryDiskCPU20.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脚本的教程到此结束。