0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用10行bash shell脚本监控Linux

dyquk4xk2p3d 来源:马哥Linux运维 2023-04-10 11:50 次阅读

监控我们的环境对于服务器运维来说至关重要,尤其是在部署新的应用程序时。如今,公司每天都使用开源解决方案来监控系统资源。但是,当出于测试的目的来监控一定时间时,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 测试

d39eb78c-d683-11ed-bfe3-dac502259ad0.png

由于机器上几乎没有任何负载,我们可以使用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】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    只需10行脚本就可监控你的操作系统?

    今天浩道跟大家分享硬核shell实战干货,利用10shell脚本监控你的
    发表于 11-14 09:18 391次阅读

    如何在bash shell脚本中使用变量

    如果你使用编程语言编写过程序,那么一定接触过变量。而在 bash 脚本的编写时,变量也是一个很重要的概念。今天我们分享一下如何在 bash 脚本中使用变量。
    发表于 12-02 16:32 2101次阅读
    如何在<b class='flag-5'>bash</b> <b class='flag-5'>shell</b><b class='flag-5'>脚本</b>中使用变量

    Linux Shell脚本入门到实战详解

    Linux Shell脚本入门到实战详解
    发表于 02-17 15:03 636次阅读

    Linux shell脚本分享

    今天浩道跟大家分享几个Linux运维中常用到的shell脚本
    发表于 07-18 09:53 556次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>shell</b><b class='flag-5'>脚本</b>分享

    Linux_Bash脚本编程大全

    毫无疑问,UNIX/Linux 最重要的软件之一就是shell,目前最流行的shell 被称为Bash(Bourne Again Shell
    发表于 10-22 16:17 57次下载

    linux shell 脚本入门

    1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的开始(必须方在文件的第一): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行
    发表于 11-07 15:44 11次下载

    Linux系统命令及shell脚本实践指南

    Linux系统命令及shell脚本实践指南资料下载。
    发表于 06-01 14:47 28次下载

    Linux命令行与shell脚本编写

    Linux命令行与shell脚本编写
    发表于 01-11 16:50 4次下载

    每个Linux用户都需要知道的重要Bash shell变量

    Bash 是大多数 Linux 发行版的默认 shell。以下是每个 Linux 用户都需要知道的一些重要的 Bash
    的头像 发表于 02-13 09:22 905次阅读

    Linux Shell脚本经典案例分享

    ​ 作为一名 Linux 运维工程师,会写好的脚本不仅能提高工作效率,还能有更多的时间做自己的事。最近在网上冲浪的时候,发现大家对Shell脚本都有“心结”,要么觉得自己写出来不好
    发表于 06-16 14:03 649次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>Shell</b><b class='flag-5'>脚本</b>经典案例分享

    BASH shell脚本篇—条件命令

    这篇文章介绍下BASH shell中的条件相关的命令,包括:if, case, while, until, for, break, continue。
    的头像 发表于 10-11 15:21 616次阅读
    <b class='flag-5'>BASH</b> <b class='flag-5'>shell</b><b class='flag-5'>脚本</b>篇—条件命令

    BASH shell脚本篇—函数

    函数是代码重用的最重要方式。Bash函数可以定义为一组命令,在bash脚本中多次调用。
    的头像 发表于 10-20 16:31 1098次阅读

    BASH shell脚本篇—文件处理介绍

    Bash Shell脚本中,可以使用多种方法来对文件进行操作,包括读取文件或写入文件。
    的头像 发表于 10-23 16:51 619次阅读

    Shell脚本检查工具ShellCheck介绍

    ShellCheck是一个用于bash/sh shell脚本的静态分析工具,可以辅助检查脚本语法错误,给出建议增强脚本健壮性。
    的头像 发表于 12-27 13:43 2101次阅读
    <b class='flag-5'>Shell</b><b class='flag-5'>脚本</b>检查工具ShellCheck介绍

    Linux从零到精通:最简单的Shell脚本入门教程

    case语句 shell变量数组 shell脚本前言 |为什么学习shell编程 Shell脚本
    的头像 发表于 12-05 09:56 389次阅读
    <b class='flag-5'>Linux</b>从零到精通:最简单的<b class='flag-5'>Shell</b><b class='flag-5'>脚本</b>入门教程