目录
一、需求
二、分析
三、脚本示例
1、创建脚本
2、编写脚本
3、脚本编写注意事项
(1)CPU占用率列
(2)多进程实例
(3)权限
四、运行脚本
1、给予脚本可执行权限
2、运行脚本
五、优化脚本
1、更改脚本
2、执行脚本
一、需求
在linux环境下,视频软件要处理视频的编码、解码、拼接等等工作,会占用大量的CPU资源。所以,在这些视频软件的开发调试过程中,经常会出现各种性能问题,会导致程序、进程等出现异常情况。如果系统出现无响应或性能下降,查看系统中相关进程对CPU的使用率,可以帮助快速定位是否是本系统占用了过多的CPU资源,从而导致系统性能下降。
因此,一个需求是如何统计视频软件程序相关的所有进程对CPU的占用率是多少?
二、分析
在Linux中,可以通过一些命令来查看特定进程的CPU占用率,涉及到使用ps、grep、awk等命令来提取进程信息和它们的CPU使用率。
然后,可以通过编写一个脚本来统计多个进程的CPU使用率的总和。
三、脚本示例
1、创建脚本
创建一个名为 monitor_pros_cpu.sh 的脚本文件。
2、编写脚本
使用编辑器打开 monitor_pros_cpu.sh 文件,并添加以下内容:
#!/bin/bash # 确保至少有一个参数被传递
if [ $# -eq 0 ]; then echo "Usage: $0 <process_name1> [process_name2 ...]" exit 1
fi # 遍历所有传入的进程名
for process_name in "$@"
do # 使用系统的ps命令查找进程,并通过grep和awk提取CPU占用率 # 注:这里使用grep的-v选项排除grep自身进程,并使用awk处理输出 # 假设CPU占用率是ps命令输出的第三列(这可能根据你的ps版本和输出格式不同而有所不同,可以更改) cpu_usage=$(ps -eo pid,args,%cpu --sort=-%cpu | grep -v grep | grep "$process_name" | awk '{print $3}') # 检查是否找到进程 if [ -n "$cpu_usage" ]; then echo "Process '$process_name' CPU usage: $cpu_usage%" else echo "Process '$process_name' not found." fi
done
3、脚本编写注意事项
(1)CPU占用率列
在上面的脚本中,假设CPU占用率是ps命令输出的第三列(%cpu)。这可能会根据ps版本和输出格式而有所不同。可以通过运行如下命令:
ps -eo pid,args,%cpu --sort=-%cpu
来查看你的系统上ps命令的实际输出,并相应地调整脚本中的列号。
(2)多进程实例
如果同一进程名有多个实例运行,上面的脚本将只打印出第一个找到实例的CPU占用率。如果你需要所有实例的CPU占用率,你可能需要稍微修改脚本,以便处理多个输出行。
(3)权限
确保你有足够的权限来查看所有进程的信息。在某些系统上,你可能需要使用sudo来运行这个脚本。
四、运行脚本
1、给予脚本可执行权限
首先,给脚本执行权限:
chmod +x monitor_pros_cpu.sh
2、运行脚本
然后,你可以这样运行脚本,传递你感兴趣的进程名作为参数:
./monitor_pros_cpu.sh java
实际操作如下图所示:
或者,如果你想要同时监控多个进程:
./monitor_pros_cpu.sh java srs.out
这将为每个指定的进程名输出其CPU占用率(如果存在的话)。
实际操作如下图所示:
五、优化脚本
1、更改脚本
前面的脚本只是统计每个进程的CPU占有率,要把这些进程的CPU占用率累加起来,应该如何修改脚本呢?
可以在脚本中添加一个变量来累加这些CPU占用率。比如增加一个变量:
total_cpu_usage=0 。
优化后的脚本如下:
#!/bin/bash# 初始化CPU占用率总和为0
total_cpu_usage=0# 确保至少有一个参数被传递
if [ $# -eq 0 ]; thenecho "Usage: $0 <process_name1> [process_name2 ...]"exit 1
fi# 遍历所有传入的进程名
for process_name in "$@"
do# 使用ps命令查找进程,并通过grep和awk提取CPU占用率# 注意:这里使用grep的-v选项排除grep自身进程,并使用awk处理输出# 假设CPU占用率是ps命令输出的第三列(这可能根据你的ps版本和输出格式不同而有所不同)cpu_usage=$(ps -eo pid,args,%cpu --sort=-%cpu | grep -v grep | grep "$process_name" | awk '{print $5}')# 检查是否找到进程if [ -n "$cpu_usage" ]; then# 将百分比转换为小数(去掉%号)cpu_usage_decimal=$(echo "$cpu_usage" | sed 's/%//')# 累加CPU占用率(注意:这里的累加是基于小数形式的,但由于shell的算术运算限制,我们可能需要使用bc或awk)total_cpu_usage=$(echo "$total_cpu_usage + $cpu_usage_decimal" | bc)echo "Process '$process_name' CPU usage: $cpu_usage%"elseecho "Process '$process_name' not found."fi
done# 打印所有指定进程的CPU占用率总和(注意:这个总和可能不准确,因为它只是简单地将百分比转换为小数后相加)
echo "Total CPU usage of specified processes: ${total_cpu_usage}%"
2、执行脚本
同时监控多个进程:
./monitor_pros_cpu.sh java srs.out
这将为每个指定的进程名输出其CPU占用率(如果存在的话),并统计所用进程的CPU占有率之和。
实际操作如下:
由图中可以看出,最后统计出来两个进程的CPU占有率之和为:0.2% + 1.1% =1.3%,结果正确。
文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。