文章目录
- 公司任务
- 脚本思路
- 脚本源码及写作过程
- 执行测试
- 又遇到问题
- 问题解决
- 总结
公司任务
王同学刚刚入职,就被安排了一项任务,据说还比较紧急。
公司一共有200多台服务器,要求王同学统计一下每台服务器的IP,以及各个进程的数量。
王同学刚刚手工查询了10台就打退堂鼓了,这一条条的命令干下去得加班到几点。
这时候一个念头突然闪现在王同学的脑海里: 一切自动化都是以手工能实现为基础的,那我现在已经能够手工实现了,是否可以试试自动化呢?
说干就干,不服就直接上脚本
脚本思路
我们在这个脚本中,统计如下信息:
- 总进程的数量
- running的进程数
- stoped 进程数量
- sleeping 进程的进程数
- 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
操作步骤如下:
- 创建一个文件,里面写上要分发的服务器IP地址
- 写一个脚本遍历这些IP,然后做一个SSH免密钥登录
- 最后在脚本里SCP给每台服务器对应的IP分发到B服务器
- 在脚本中加入执行完的结果要导入到本地的某个文件中
- 在用scp命令拷贝回A服务器的特定路径
- 最后在A服务器写个脚本对拷贝过来的200个文件进行处理
所以到这里问题就变成了如何将目录下多个文件合并成一个文件。
我们其实使用一条命令就能搞定:
find ./ -name *.txt |xargs cat > total.txt
这种方式没有添加换行符,有时候看起来比较难受。 如果需要使用换行符的话可以用下面的命令
设置换行符为 ^J
find ./ -name *.txt |xargs sed ‘a^J’ > total.txt
到这里我们的问题就解决了。
总结
其实你会看到,我们在写脚本的过程中,并不是一次写好的,而是解决好一个问题,同时伴随着出现另一个问题, 这时候我们在解决第二个问题。
直到全部解决后,在考虑是否要优化脚本。
很多小伙伴没有优化的习惯,因为大多数时候我们写完脚本,去完成了工作,也就把脚本放在一边了,如果你想跟深入的提高自己的能力,一定要对脚本进行优化。