You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何捕获指定终止进程的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:18:44