背景:在测试性能的时候需要查看CPU和内存的占用情况,就需要持续获取CPU、内存数据最终以图表形式展示,那怎么做呢?
先看结果:
再看代码
# 配置进程名
process='mysql'
# 配置次数
number=5
# 配置间隔时间
time=3
echo "%CPU,%MEM">test.csv
pid=$(ps -aux | grep ${process} | awk -F' ' '{OFS=","}{print $2}' | head -n 1)
top -b -d ${time} -n ${number} -p ${pid} | grep 'mysqld' | awk -F' ' '{OFS=","}{print $9,$10}'>>test.csv
cat test.csv
sz test.csv
知识准备
echo # 控制台输出
top # 动态查看进程信息
# -b:以批处理(batch)模式运行,直接将结果输出到文件
# -d <秒数>:指定 top 命令的刷新时间间隔,单位为秒
# -n <次数>:指定 top 命令运行的次数后自动退出
# -p <进程ID>:仅显示指定进程ID的信息。
# 实例:top -b -d 5 -n 20 -p 938
grep # 查看文件中的内容,这里主要是查看控制台输出的指定进程的内容
awk # 分割
# -F' ':分割内容
# {OFS=","}:替换分割内容
# {print $5,$6} :显示内容 $<数字(第几行)>
# 实例:awk -F' ' '{OFS=","}{print $5,$6}'
| # 管道符,将前面输出的内容当作后面命令的输入
> # 重定向(将输出内容写入文本文件),覆盖
>> # 重定向,追加
sz # 下载文件到本地
ps # 查看进程信息
# -a : 显示终端上的所有进程,包括其他用户的进程
# -u : 显示进程的详细状态
# -x :显示没有控制终端的进程
head # 从开头查看文本内容
# -n <行数>:查看几行
# 变量赋值
process=$(命令)
process='mysql'
# 变量引用
${process}
1、首先定义两个字段CPU&内存写入TCP+内存.csv
echo "%CPU,%MEM">TCP+内存.csv
2、通过top和awk获取CPU和内存数据
2.1、通过top获取到的信息太多了,我们只需要CPU和内存
top
2.2、通过ps获取到进程pid,因为接下来要指定进程
ps -aux | grep 'mysql'
2.3、再通过 top -p 938 指定进程,可以看到只有一条数据了,但是还有很多其他的内容,我们需要的只是CPU和内存数据
top -p 938
2.4、再通过 top -p 938 | grep "mysqld",可以看到又过滤了一部份,但是离我们想要的数据还是有差距
top -p 938 | grep "mysqld"
2.5、先将上面内容写入到文件中,方便接下来看awk分割效果
top -b -d 5 -n 20 -p 938 | grep 'mysqld' > 1.txt
2.6、再通过 awk -F' ' '{OFS=","}{print $5,$6}' 首先按照空格去分割(-F' '),其次再选择需要的部分({print $5,$6}),由于我们最终得到的数据是csv格式的,所以我在这里将空格替换成 ,({OFS=","}),可以看到我们已经得到想要的数据了
awk -F' ' '{OFS=","}{print $10,$11}'
2.7、这里直接将控制输入的结果直接当成文件进行分割,最后写入文件,然后就结束了
top -b -d 5 -n 20 -p 938 | grep 'mysqld' | awk -F' ' '{OFS=","}{print $5,$6}'>>test.csv
2.8、查看文件内容,看看是否写入成功
cat 1.txt
2.9、下载文件
2.9.1、安装lrzsz包
yum install lrzsz
2.9.2、sz下载文件
sz test.csv
3、为了便捷,最后我们就可以来写一个shell脚本,其实就是将上面的命令都写入一个test.sh的文件
创建文件
touch test.sh
文件中的内容
# 配置进程名
process='mysql'
# 配置次数
number=5
# 配置间隔时间
time=3
echo "%CPU,%MEM">test.csv
pid=$(ps -aux | grep ${process} | awk -F' ' '{OFS=","}{print $2}' | head -n 1)
top -b -d ${time} -n ${number} -p ${pid} | grep 'mysqld' | awk -F' ' '{OFS=","}{print $9,$10}'>>test.csv
cat test.csv
sz test.csv
给文件赋执行权
chmod o+x test.sh
执行脚本
./test.sh