如何捕获指定终止进程的top命令输出以记录其CPU使用率?
解决top监控进程终止后日志为空的问题
我明白你的痛点:想用top记录指定进程(PID=18686)生命周期内的CPU使用率,但当前命令在进程提前终止时会生成空日志——这是因为tail -1只取最后一行,而如果进程在top -n 1000完成前就退出,top要么停止输出有效统计行,要么最后一行是错误提示,自然抓不到有用数据。
下面给你两个针对性的解决方案,按需选择:
方案1:记录进程整个生命周期的所有CPU数据
如果需要追踪每5秒一次的CPU变化,用这个方法:它会持续监控进程,只记录进程的CPU使用率,自动在进程终止时停止,完全不用依赖-n参数做权宜之计。
MYPID=18686 # 先等待进程启动(如果你的脚本可能在进程启动前运行) while ! kill -0 $MYPID 2>/dev/null; do sleep 1; done # 用top持续输出,通过awk过滤掉表头和无效行,只保留目标进程的CPU使用率 top -b -d 5 -p $MYPID | awk -v target_pid=$MYPID ' $1 == target_pid { print $9 } # $9对应top输出中的CPU列,若列位置不同可自行调整 ' > log.txt
说明:
- 去掉
-n 1000后,top会一直运行直到目标进程消失,自动终止 awk只匹配PID列等于目标进程的行,提取第9列(CPU使用率),完美避开top的重复表头- 如果你的top输出中CPU列不是第9位,先运行
top -b -n 1 -p $MYPID查看列顺序,修改$9为对应列号即可
方案2:只记录进程终止前最后一次的CPU使用率
如果只需要进程结束前的最后一次CPU数据,用循环检测的方式更可靠:
MYPID=18686 last_cpu="" # 循环检查进程是否存活,每5秒获取一次CPU数据 while kill -0 $MYPID 2>/dev/null; do # 单次运行top,提取目标进程的CPU使用率 current_cpu=$(top -b -n 1 -p $MYPID | awk '$1 == pid {print $9}' pid=$MYPID) last_cpu=$current_cpu sleep 5 done # 把最后一次记录的CPU写入日志 echo $last_cpu > log.txt
说明:
kill -0 $MYPID用来静默检查进程是否存在,不会发送任何信号- 每次循环获取当前CPU并更新
last_cpu,进程终止后将最后一次数据写入日志,绝对不会为空
为什么你的原命令会失败?
当进程提前终止时,top会立刻停止输出有效统计行,要么输出类似top: pid '18686' not found的错误信息,要么直接退出。这时候tail -1抓取的最后一行要么是错误提示,要么根本没有有效统计行,导致日志为空。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

