当前位置: 首页 > news >正文

实战:一个脚本实现统计linux进程相关的信息

文章目录

    • 公司任务
    • 脚本思路
    • 脚本源码及写作过程
    • 执行测试
    • 又遇到问题
    • 问题解决
    • 总结

公司任务

王同学刚刚入职,就被安排了一项任务,据说还比较紧急。
公司一共有200多台服务器,要求王同学统计一下每台服务器的IP,以及各个进程的数量。

王同学刚刚手工查询了10台就打退堂鼓了,这一条条的命令干下去得加班到几点。

Alt

这时候一个念头突然闪现在王同学的脑海里: 一切自动化都是以手工能实现为基础的,那我现在已经能够手工实现了,是否可以试试自动化呢?

说干就干,不服就直接上脚本

脚本思路

我们在这个脚本中,统计如下信息:

  1. 总进程的数量
  2. running的进程数
  3. stoped 进程数量
  4. sleeping 进程的进程数
  5. zombie进程的进程数

这里面应该还包括服务器的IP,每台服务器执行这个脚本,我们可以用ansible批量分发,然后执行完成后进行收集,或者直接导入某个文件中进行数据处理。

脚本源码及写作过程

在脚本中我们先定义各类需要统计的进程数变量,比如running表示正在运行的进程, sleeping表示睡眠中的进程。

使用for循环遍历,然后用case语句进行承接
没遍历出对应的编号记录,就在当前的case分支里加1,最后统计进程的结果即可

统计 Linux 进程相关数量信息
#!/bin/bash
# 统计 Linux 进程相关数量信息
running=0
sleeping=0
stoped=0
zombie=0
# 在 proc 目录下所有以数字开始的都是当前计算机正在运行的进程的进程
PID
# 每个 PID 编号的目录下记录有该进程相关的信息
for pid in /proc/[1‐9]*
do
 procs=$[procs+1]   ## 每次循环加1
 stat=$(awk '{print $3}' $pid/stat)
# 每个 pid 目录下都有一个 stat 文件,该文件的第 3 列是该进程的状态信case $stat in
 R)
 ## running进程
 running=$[running+1]
 ;;
 T)
 ## stoped进程
 stoped=$[stoped+1]
 ;;
 S)
 sleeping=$[sleeping+1]
 ;;
 Z)
 ## 僵尸进程
 zombie=$[zombie+1]
 ;;
 esac
done
echo "进程统计信息如下"
echo "总进程数量为:$procs"
echo "Running 进程数为:$running"
echo "Stoped 进程数为:$stoped"
echo "Sleeping 进程数为:$sleeping"
echo "Zombie 进程数为:$zombie"

执行测试

测试结果如图:
在这里插入图片描述
这里面好像少了IP, 于是把IP添加上:
ip=ifconfig |grep inet |awk '{print $2}'

通过这个命令,可以直接获取到IP地址,并输出到屏幕上,接下来就是使用ansible进行批量分发了。

又遇到问题

王同学没有学过ansible,临时学也不赶趟,有没有不适用ansible进行分发的方法

于是王同学向我请教

问题解决

这里我们其实可以使用ssh进行分发,不使用ansible
操作步骤如下:

  1. 创建一个文件,里面写上要分发的服务器IP地址
  2. 写一个脚本遍历这些IP,然后做一个SSH免密钥登录
  3. 最后在脚本里SCP给每台服务器对应的IP分发到B服务器
  4. 在脚本中加入执行完的结果要导入到本地的某个文件中
  5. 在用scp命令拷贝回A服务器的特定路径
  6. 最后在A服务器写个脚本对拷贝过来的200个文件进行处理

所以到这里问题就变成了如何将目录下多个文件合并成一个文件。

我们其实使用一条命令就能搞定:

find ./ -name *.txt |xargs cat > total.txt

这种方式没有添加换行符,有时候看起来比较难受。 如果需要使用换行符的话可以用下面的命令

设置换行符为 ^J

find ./ -name *.txt |xargs sed ‘a^J’ > total.txt

到这里我们的问题就解决了。

总结

其实你会看到,我们在写脚本的过程中,并不是一次写好的,而是解决好一个问题,同时伴随着出现另一个问题, 这时候我们在解决第二个问题。

直到全部解决后,在考虑是否要优化脚本。

很多小伙伴没有优化的习惯,因为大多数时候我们写完脚本,去完成了工作,也就把脚本放在一边了,如果你想跟深入的提高自己的能力,一定要对脚本进行优化。

相关文章:

  • 免费开源的箱包制造行业ERP管理系统介绍
  • 【SpringBoot+Redis】实现多端登录+token自动续期和定期刷新+自定义注解和拦截器实现鉴权(角色和权限校验)
  • 跟着pink老师学JS的第三天总结
  • 嵌入式:ARM 汇编控制伪操作
  • 写给Java程序员的GRPC入门系列(3)
  • Python常用函数笔记汇总2
  • AI小组2022总结
  • 【jrebel and xrebel问题记录】激活时出现LS client not configued
  • css中动画之transition
  • QT学习 控件(一):按钮类
  • 数据治理:企业数据治理蓝图
  • Socket套接字(网络编程万字总结-附代码)
  • 6、GPIO输入按键检测(轮询检测)
  • C# XPath的概念
  • redhat9安装卸载mysql
  • 个人博客系统(前后端分离)
  • 商品分类管理系统实现(Vue + ElementUI)
  • ReactJS入门之Model层
  • 一文解析Linux中断子系统softirq和tasklet
  • Arduino与Proteus仿真实例-雷达扫描仿真
  • 坚守刑事检察一线13年,“在我心中每次庭审都是一次大考”
  • 利物浦提前四轮英超夺冠,顶级联赛冠军数追平曼联
  • 铁路上海站五一假期预计发送446万人次,同比增长8.4%
  • 首映|《人生开门红》:段子背后都是案子
  • 中方在IMF发声:美滥施关税威胁全球金融稳定,对新兴市场和发展中国家构成严峻挑战
  • 对外投资增长、消费市场持续升温,中国经济砥砺前行