shell实战案例:系统性能监控脚本

news2025/7/12 18:41:21

一 简介

        下面我们来编写一个检测系统环境、监控系统性能的脚本,并判断各项数据指标是否符合预设的阈值。如果数据有异常,就报警,如何报警,视情况而定。注意脚本中的很多预设值只是假设值,在实际生产环境中还需要根据业务和环境的需要,调整这些预设值。限于水平,本文仅获取部分性能参数指标,如果还有其他需要监控的数据,会在以后的学习中加进来的。

二 获取系统信息

1 获取本机日期时间

root@hehe:~# local_time=$(date +"%Y%m%d %H:%M:%S");echo ${local_time}
20221015 15:08:02
root@hehe:~#

2 获取本机ip地址

变量eth_name用于存放网口名字。视情况而赋值。

root@hehe:~# eth_name=eth1
root@hehe:~# local_ip=$(ifconfig ${eth_name} | grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sed -n '1p');echo ${local_ip}
192.168.0.3
root@hehe:~#


3 获取可用内存

root@hehe:~# mem_free=$(cat /proc/meminfo | grep Available | tr -s " " | sed 's/:/ /g' | awk '{print $2}');echo ${mem_free}
434276
root@hehe:~#

报警: 

 如果可用内存小于XXXMB,报警。假设小于500BM就输出报警:现在剩余400多BM,报警啦

root@hehe:~# [ $mem_free -lt 512000 ] && echo "no mem:${local_time} - ${mem_free} - ${local_ip}"
no mem:20221015 15:08:02 - 434276 - 192.168.0.3
root@hehe:~#

4 获取根目录剩余空间

root@hehe:~# df
Filesystem     1K-blocks   Used Available Use% Mounted on
/dev/root        7244864 745604   6124580  11% /
devtmpfs          187532      4    187528   1% /dev
tmpfs                 40      0        40   0% /mnt/.psplash
tmpfs             253344    136    253208   1% /run
tmpfs             253344    108    253236   1% /var/volatile
/dev/mmcblk1p1    129039   6466    122573   6% /mmcblk1p1
root@hehe:~#

首先,获得"/"结尾的行,就是根目录啦。


root@hehe:~# df | grep "/$"
/dev/root        7244864 745604   6124580  11% /
root@hehe:~#

然后,去掉空格

root@hehe:~# df | grep "/$" | tr -s " "
/dev/root 7244864 745604 6124580 11% /
root@hehe:~#

第三,取出Available对应列的值。

root@host:~# df | grep "/$" |tr -s " " | cut -d" " -f4
11511
root@host:~#

最后,将这个值存放到变量中,齐活。

root@hehe:~# free_disk=$(df | grep "/$" |tr -s " " | cut -d" " -f4);echo ${free_disk}
6124580
root@hehe:~#

或者

root@hehe:~# free_disk=$(df | grep "/$" |tr -s " " | awk {'print $4'});echo ${free_disk}
6124580
root@hehe:~#

报警:  

 如果可用磁盘小于10GB,报警。现在剩余6GB,报警啦 

root@hehe:~# [ ${free_disk} -lt 10485760 ] && echo "no disk:${local_time} - ${free_disk} - ${local_ip}"
no disk:20221015 15:08:02 - 6124580 - 192.168.0.3
root@hehe:~#

5 获取CPU15分钟平均负载

/proc/loadavg文件中前三个值分别是1分钟,5分钟和15分钟平均负载。第四个的分子是正在运行的进程数,分母是进程总数;最后一个是最近运行的进程ID号。

        这也不知道是不是真的?一般来说每个CPU的当前活动进程数不大于3那么系统的性能就是良好的。如果每个CPU的任务数大于5,那么就表明机器的性能有严重问题。

        我感觉大于1,就应该注意了吧。

        对于下面的例子来说,系统有1个CPU,那么其每个CPU在1分钟内的进程数为:0.01/1 = 0.01。等于是CPU真的很闲啊,它也确实什么都没干。

root@hehe:~# cat /proc/loadavg
0.00 0.01 0.05 1/71 809
root@hehe:~# cat /proc/loadavg | cut -d' ' -f3
0.05
root@hehe:~# cpu_load=$(cat /proc/loadavg | cut -d' ' -f3);echo ${cpu_load}
0.05
root@hehe:~#

报警:  

 当CPU的15min平均负载超过1时,报警。我的cpu太闲了,手动给cpu_load一个值2.

root@hehe:~# cpu_load=2
root@hehe:~# [ $cpu_load -gt 1 ] && echo "cpu two busy:${local_time} - ${cpu_load} - ${local_ip}"
cpu two busy:20221015 15:08:02 - 2 - 192.168.0.3
root@hehe:~#

将值改为1,输出很happy

root@hehe:~# cpu_load=1
root@hehe:~# [ $cpu_load -gt 1 ] && echo "cpu two busy:${local_time} - ${cpu_load} - ${local_ip}" || echo "cpu very happy"
cpu very happy
root@hehe:~#

6 获取登录用户数

root@host:~# who
root            pts/0           00:00   Jan  1 00:24:00  192.168.0.5
root            pts/1           00:00   Jan  1 09:13:23  192.168.0.5
root@host:~# who | wc -l
2
root@host:~# login_user=$(who | wc -l);echo ${login_user}
2
root@host:~#

 报警:

登录用户数如果超出预期,可能是黑客入侵,要报警。

root@hehe:~# login_user=3
root@hehe:~# [ $login_user -gt 2 ] && echo "bad man:${local_time} - ${login_user} - ${local_ip}" || echo "no bad man"
bad man:20221015 15:08:02 - 3 - 192.168.0.3
root@hehe:~# login_user=1
root@hehe:~# [ $login_user -gt 2 ] && echo "bad man:${local_time} - ${login_user} - ${local_ip}" || echo "no bad man"
no bad man
root@hehe:~#

似乎找到了偷懒的好方法,以后的测试数据,都使用两个假的,一个报警数据,一个安全数据,这样就可以做到覆盖测试了。

7 获取进程数

执行的命令本身也会占用一个进程

root@host:~# ps aux | wc -l
60
root@host:~# proc_num=$(ps aux | wc -l);echo ${proc_num}
61
root@host:~#

 报警: 

显示3个进程,CPU很happy,然后是100个进程,cpu很busy。

root@hehe:~# proc_num=3
root@hehe:~# [ $proc_num -gt 80 ] && echo "too many process:${local_time} - ${proc_num} - ${local_ip}" || echo "cpu is happy"
cpu is happy
root@hehe:~# proc_num=100
root@hehe:~# [ $proc_num -gt 80 ] && echo "too many process:${local_time} - ${proc_num} - ${local_ip}" || echo "cpu is happy"
too many process:20221015 15:08:02 - 100 - 192.168.0.3
root@hehe:~#

8 获取中断数

vmstat提供了一个低开销的良好系统性能视图。由于所有的性能统计数据都以文本形式呈现,并打印到标准输出,因此,捕捉测试中生成的数据,以及之后对其进行处理和绘图就会很方便。由于vmstat的开销如此之低,因此当你需要一目了然地监控系统健康状况时,让它在控制台上或窗口中持续运行,甚至是在负载非常重的服务器上是很实用的。 

vmstat的每个列的含义:in列表示中断数,在我的系统中默认是第11列。

下面是分布测试,最后一步将该值irq数,保存到变量irq_num; 

root@hehe:~# vmstat 1 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 460324   4664  26664    0    0   452    13  102  296 11 13 76  0  0
 0  0      0 460340   4664  26692    0    0     0     0   22   31  0  0 100  0  0
root@hehe:~#
root@hehe:~# vmstat 1 2 | tail -n +4
 0  0      0 460316   4668  26752    0    0     0     0   14   27  0  0 100  0  0
root@hehe:~# vmstat 1 2 | tail -n +4 | tr -s " "
 0 0 0 460168 4672 26804 0 0 0 0 12 25 0 1 99 0 0
root@hehe:~# vmstat 1 2 | tail -n +4 | tr -s " " | awk '{print $11}'
15
root@hehe:~# irq_num=$(vmstat 1 2 | tail -n +4 | tr -s " " | awk '{print $11}');echo ${irq_num}
14
root@hehe:~#

 报警: 

先3个irq,CPU很happy,然后是100个irq,cpu很busy。

root@hehe:~# irq_num=3
root@hehe:~# [ $irq_num -gt 200 ] && echo "too many process:${local_time} - ${irq_num} - ${local_ip}" || echo "cpu is happy"
cpu is happy
root@hehe:~# irq_num=1000
root@hehe:~# [ $irq_num -gt 80 ] && echo "too many process:${local_time} - ${irq_num} - ${local_ip}" || echo "cpu is happy"
too many process:20221015 15:08:02 - 1000 - 192.168.0.3
root@hehe:~#

截图:为啥截图是,算是自励吧。

  剩下的就不报警了。

 9 获取上下文切换数

root@hehe:~# cs_num=$(vmstat 1 2 | tail -n +4 | tr -s " " | awk '{print $12}');echo ${cs_num}
32
root@hehe:~#

10 用户进程占用时间百分比

root@hehe:~# user_time=$(vmstat 1 2 | tail -n +4 | tr -s " " | awk '{print $13}');echo ${user_time}
1
root@hehe:~#

11 等待IO占用时间百分比

root@hehe:~# iow_time=$(vmstat 1 2 | tail -n +4 | tr -s " " | awk '{print $16}');echo ${iow_time}
0
root@hehe:~#

综合实例:

就是把上面这些东西复制到一个脚本中,累似了。改天再写。

小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cubeIDE开发, 物联网应用之stm32的蓝牙通信设计

一、蓝牙通信技术 蓝牙技术是一种点对点点对面的网络构架,他可以在限制的范围内以很快的速度传输网络数据,在物联网应用中,支持网状网络的物联网短距离无线通信。目前它还被广泛用于智能可穿戴设备、智能门锁、智能医疗设备、智能照明设备、智…

十二、CANdelaStudio入门-Security

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的Security概念,欢迎各位朋友订阅、评论,…

【GamePlay】Unity手机屏幕UI适配问题

前言 关于UI不同分辨率适配问题和摄像机视口的注意事项 画布大小与锚点 首先要了解这两个东西 对于画布大小,主要理解match的含义,滑到Width时,表示以宽度为基准,Width不变,Height根据真机分辨率改变。 比如自己设…

pytest测试框架搭建

文章目录一、pytest是什么?二、pytest的特点三、pytest下载安装四、pytest的配置五、pytest约束规则六、编写脚本七、pytest的运行方式1、主函数模式2、命令行模式3、通过读取pytest ini配置文件运行 (最主要运用的方式)一、pytest是什么&…

【Unity】按Text文本内容自适应背景大小

按照文本内容自动调节背景框大小是十分方便的,本文章记录一下通过无代码方式实现该效果。(版本Unity2018.4) 目录 一、Text组件操作 二、Image组件操作 三、效果展示 一、Text组件操作 创建新的Text组件,然后进行下面操作&am…

LabVIEW避免在使用functional global时内存中有多个大数组的拷贝

LabVIEW避免在使用functional global时内存中有多个大数组的拷贝 有一个非常大的数组,但想保证在内存中只有一个拷贝.知道可以用移位寄存器,并用"ReplaceArray Subset" VI 保证只有一个拷贝。然而,想使之成为一个functionalglobal。因为,不能…

Ceph对象存储

目录 一、环境准备 二、什么是对象存储 三、部署对象存储服务 1、启动RGW服务 2、更改RGW服务端口 3、客户端测试 一、环境准备 Ceph集群搭建参照:Ceph集群部署_桂安俊kylinOS的博客-CSDN博客 以下Ceph存储实验环境均基于上述Ceph集群环境搭建。 二、什么是…

理解中国经济的五层思维-中国视角下的宏观经济

理解中国经济的五层思维 – 潘登同学的宏观经济学笔记 文章目录理解中国经济的五层思维 -- 潘登同学的宏观经济学笔记思想的力量理解中国经济的五层思维第一层思维:唯GDP论第二层思维:天真的市场派(新-新古典综合世界观对中国经济的影响)第三层思维&…

20221126给Chrome浏览器安装扩展程序——猫抓

20221126给Chrome浏览器安装扩展程序——猫抓 2022/11/26 21:43 百度:chrome 猫爪 https://www.onlinedown.net/soft/1232149.htm 猫抓 1.0.17 最新版 设置→ 01 百度搜索 QQ图片20221126214334.png 02 猫抓 QQ图片20221126214407.png 03 设置.png 04扩展程序.…

HTTP介绍报文格式构造

HTTP 一. 简单介绍一下: 二. 学习报文格式: 三. HTTP中的细节介绍 四, 如何构造一个HTTP请求 一. 简单介绍一下: 是应用层的典型协议客户端发送一个HTTP请求, 服务器返回一个HTTP响应(一问(请求)一答(响应)的)HTTP是文本格式的协议二. 学习报文格式: 1)先简单看一看HTTP的…

有监督学习神经网络的回归拟合——基于红外光谱的汽油辛烷值预测(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

2022年11月26日NaiveBayes

参考 ​ 朴素贝叶斯算法的核心思想是通过考虑特征概率来预测分类,即对于给出的待分类样本,求解在此样本出现的条件下各个类别出现的概率,哪个最大,就认为此待分类样本属于哪个类别。 ​ 我的理解是已知结果然后计算所有导致结果原…

[BJDCTF2020]EzPHP

前言 这个题目考的php知识真的比较多,也比较经典。由于我php基础不是很好,总会遇到一些问题。花时间弄懂这道题后也能更加巩固所学的知识。所以这道题还是有必要记录下来的。 题目 打开题目,在前端代码注释有这么一行编码。 受固化思想的影…

[CVPR2022] Cross-Model Pseudo-Labeling for Semi-Supervised Action Recognition

Cross-Model Pseudo-Labeling for Semi-Supervised Action Recognition 要点: 1、半监督动作识别,使用伪标记分配未标记数据,然后在训练中用作附加的监督 2、最近研究:伪标签通过在标记数据上训练模型获取,然后使用来…

重装系统电脑黑屏开不了机如何处理

​电脑使用时间久了难免就出现各种故障,比如卡顿、黑屏甚至崩溃直接开不了机。那么电脑黑屏开不了机怎么办呢?其实还是有解决的办法的,接下来看看小编是如何解决的吧! 工具/原料: 系统版本:windows 10系统 品牌型号&#xff1…

求余数联系和赋值运算

算术和赋值运算符 算术运算符&#xff1a; (加)、 -(减)、 *(乘)、 /(除)、 %(求余) 赋值运算符&#xff1a;、 、 -、 *、 /、 % 加法运算代码及效果 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title&…

Wlan三层组网+三层漫游

目录 wlan漫游配置(三层漫游)拓扑图和配置如下 思路: wlan配置不指定漫游组服务器的ac间漫游,实现笔记本之间在wlan覆盖范围内移动时业务不中断 要求:请大家参考教材196页完成AC间三层漫游配置&#xff0c;提交拓扑截图&#xff0c;ap上线截图&#xff0c;sta获取IP截图&#…

cpu设计和实现(协处理器hi和lo)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多同学可能不了解mips处理器&#xff0c;如果个人想补充一点mips cpu的知识&#xff0c;可以找些书籍资料来读一下&#xff0c;比如《See Mips R…

Springboot中集成mongodb,mysql(密码从密码服务中获取并且动态更新)

一.密码服务&#xff1a;公司统一进行数据库密码管理&#xff0c;为了防止密码泄露&#xff0c;会不定时更换密码&#xff0c;服务端就需要获取密码&#xff0c;类似key,value账号类型&#xff0c;首先根据数据库名去密码服务注册一个账号&#xff0c;后面通过这个注册的这个账…

【python】-详解进程与线程

文章目录进程1、多任务2、进程介绍3、多进程1 进程的创建步骤2 通过进程类创建进程对象3 进程的创建与启动代码4、进程执行带有参数的任务1 进程执行带有参数的任务2 args 参数的使用3 kwargs 参数的使用4 代码实现5 获取进程编号1 os.getpid()的使用2 os.getppid()的使用3 代码…