作者:LD系瑰精棂_142 | 来源:互联网 | 2023-09-17 19:38
想法
将某个进程占用的CPU写入文件中(文件名为 进程名_pid.tmp,创建在当前目录),以时间为序,再通过Excel绘图查看 (如果是压测CPU的话最好不要满载,要到临界值而又不满载,效果最好,满载的话,进程间容易争抢CPU而看不到最真实的情况)
把下面的shell作为脚本保存到linux机器当中,运行命令为 xxx.sh 进程名 时间秒
Shell部分
#!/bin/bash
# 括号前后要有空格,尤其是表达式,中间没有空格会被解析成一个字符串,表达式被看成字符串就是永真
if [ $# -lt 2 ]
then
echo xxx.sh 进程名 时间秒
exit
fi
# grep -v 后面接反向过滤的字符串,head拿到grep的第一行(如果很多进程重名),awk打印第二参数,也就是ps的进程号
pid=`ps -ef | grep $1 | grep -v grep | grep -v '/bin/bash' | head -n 1 | awk '{printf $2}'`
# 变量赋值左边不能有$
tmpfile=${1}_${pid}.tmp
# 判断临时文件是否被创建过,创建过就删除
if [ -e $tmpfile ]
then
rm -rf $tmpfile
fi
# 创建临时文件
touch ${1}_${pid}.tmp
# 打印一个简单的表头
echo 'timestamp cpu%' >> $tmpfile
# 持续时间存在remaining_time
remaining_time=$2
while((remaining_time--))
do
# 获取时间
time=`date +%T`
# top -b -n 1 -c 即打印一次的top
# awk 是可以累加每行的,最后打印,多个重名进程可以把它们的CPU加起来
cpu=`top -b -n 1 -c | grep -E $1 | grep -v grep | awk '{ sum_cpu+=$9; } END { printf ("%8.2f%", sum_cpu) }'`
# Ubuntu 系统可能会出现 % 转义失败的问题 (感谢网友哇哦发现的),需要使用 %% 代替
# 报错 awk: run time error: not enough arguments passed to printf("%8.2f%") FILENAME="-" FNR=2 NR=2
# cpu=`top -b -n 1 -c | grep -E $1 | grep -v grep | awk '{ sum_cpu+=$9; } END { printf ("%8.2f%%", sum_cpu) }'`
echo $time' '$cpu >> $tmpfile
sleep 1
done
遇到的问题:
运行脚本报错:syntax error: unexpected end of file
目前遇到两种可能:1、格式有误,比如if的结尾没有用fi。2、windows和linux的 \r \n问题,需要手动设置,如:vi下输入 :set ff=unix ,我用notepad++可以设置文本编辑格式为linux
shell参考资料
字符串拼接
Shell 字符串拼接_小白的进阶的博客-CSDN博客_shell字符串拼接
linux时间获取
Linux系统date命令的参数及获取时间戳的方法 - 唐世光 - 博客园
if判断语句
Shell if 条件判断_诗歌poetry的博客-CSDN博客
自增运算
shell编程之自增自减运算符_永远不要矫情的博客-CSDN博客_shell 自减
Excel部分
我是notepad++和wps一起使用的
步骤
先打开创建的文件(前面shell会创建一个文件名为 进程名_pid.tmp的文件),按住alt键手动选择一整列,然后ctrl + c
接着创建一个Excel表格,单击其中的一个方格(注意不是双击)
然后ctrl + v 粘贴,如图
在wps里选择插入,折线图(要先框选我们要做图表的数据)
就能得到我们的折线图(当然Excel还可以求平均值等操作,这里就不细说了)