当前位置: 首页> 财经> 访谈 > Shell:一行命令如何实现采集某一进程一段时间内CPU使用率

Shell:一行命令如何实现采集某一进程一段时间内CPU使用率

时间:2025/7/13 6:14:44来源:https://blog.csdn.net/netyeaxi/article/details/140332746 浏览次数:0次

首先,能想到使用top查看进程的CPU使用率,以java进程编号251346为例进行介绍

top -d 1 -p 251346

-d 表示每秒采集一次

CPU使用率是显示出来了,但这样只能在屏幕上原地刷新,我们希望能把数据每时每刻的数据都保存下来,方便进行后续分析:

top -b -d 1 -p 251346

-b 批处理模式,即会把每次采集的数据都显示出来,而不是原屏幕刷新

 

由于只需要进程251346的数据,其它全局数据不需要,所以过滤一下

top -b -d 1 -p 251346 | grep 251346

由于只是想要其中CPU使用率的数据,我们把这块数据截取出来

top -b -d 1 -p 251346 | grep --line-buffered 251346 | cut -b 49-54

--line-buffered 表示将每行数据缓存一下,这样cut命令才能按行处理
cut -b 49-54 表示截取每行第49到第54个字节

这时,如果想把结果保存到文件,假如使用如下命令

top -b -d 1 -p 251346 | grep --line-buffered 251346 | cut -b 49-54 | tee top.txt
或
top -b -d 1 -p 251346 | grep --line-buffered 251346 | cut -b 49-54 > top.txt

发现并没有导入到文件中,说明使用cut命令后不能将结果导入到文件,这里我们想到的是使用一个函数来实现

logger() { cpu=$(echo "$@") | cut -d ' ' -f 9; echo "$(date +'%Y-%m-%d %H:%M:%S'): $cpu"; }

这个函数接收一行数据,以空格为分隔符,从中截取出第9列,第9列正是CPU使用率,同时打印这条记录时还会加上记录的采集时间,便于对数据作分析用

接下来的问题就是通过管道怎么给这个函数传每行的数据,这里会用到xargs命令

xargs -n 1 -I {} bash -c 'logger {}'

-n 1  表示每次传递一个参数
-I {} 表示指定一个占位符{},每个参数会替换这个占位符,这个点位符所代表的参数,作为logger的输入

最终的shell命令如下:
 

logger() { cpu=$(echo "$@") | cut -d ' ' -f 9; echo "$(date +'%Y-%m-%d %H:%M:%S'): $cpu"; }; export -f logger; \
top -b -d 1 -p 251346 | grep --line-buffered 251346 | xargs -n 1 -I {} bash -c 'logger {}' | tee top.txt

export -f logger 表示在当前环境中导出函数,便于在其它命令中使用

执行结果如下,同时也会将结果保存到top.txt

以上是采用CPU使用率的一行命令,如果要采用内存使用率或其它信息,只要将上面的命令做相应调整就行了。 

关键字:Shell:一行命令如何实现采集某一进程一段时间内CPU使用率

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: