想法

将某个进程占用的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还可以求平均值等操作,这里就不细说了)

Logo

更多推荐