关键在于输出稳定、字段精简、差异可感知:用ps -eo显式指定pid/comm/%cpu/%mem/vsz/rss并排序,head -12限行防滑动,pgrep -f动态绑定PID,剔除etime等干扰字段,必要时改用pidstat或perf stat捕获瞬时峰值。

用 watch -n 1 实时高亮监控进程资源跳变,关键不在“加 -n 1”,而在于让输出稳定、字段精简、差异可感知。盲目设一秒刷新反而容易看花眼或掩盖真实波动。
只取关键字段,避免宽表错乱
默认 ps aux 输出 11 列以上,终端宽度一受限就换行错位,-d 高亮会失效。应显式指定字段并排序:
watch -n 1 -d 'ps -eo pid,comm,%cpu,%mem,vsz,rss --sort=-%cpu | head -12'-
ps -eo比ps aux更可控,comm只取命令名(不含参数),vsz/rss看内存占用更准 -
head -12限制行数,防止新进程挤掉老进程导致整屏滑动,破坏高亮定位
动态绑定 PID,避免进程重启后监控丢失
如果目标是某个服务(如 Python Web 应用),别写死 PID,用 pgrep 动态获取:
watch -n 1 -d 'ps -p $(pgrep -f "gunicorn.*wsgi" 2>/dev/null) -o pid,comm,%cpu,%mem,etime --no-headers 2>/dev/null || echo "No matching process"'-
pgrep -f支持模糊匹配命令行,比pgrep gunicorn更可靠 -
--no-headers和2>/dev/null防止无进程时输出报错或空行干扰高亮
让高亮真正反映“跳变”,而非“抖动”
-d 默认只比对字面文本,时间戳、随机序号、毫秒级 etime 都会导致全屏高亮。要盯住真实资源跳变,得过滤干扰项:
- 去掉
etime(启动耗时)这类必然递增字段,改用%cpu和%mem这类百分比指标 - 若需观察内存增长趋势,用
rss(KB)比%mem更敏感,但需确认单位一致(避免某次显示 123456,下一次显示 123.5M 导致误高亮) - 加
-t去掉 watch 自带标题栏,多出 3 行空间,减少换行挤压
替代方案:当跳变更剧烈或需长期盯防
如果发现 CPU 在 5% ↔ 95% 之间频繁跳变,watch 的秒级快照可能漏掉峰值。此时建议:
- 改用
pidstat -p PID 1 5(每秒采样 5 次),输出含%usr/%system分解,能判断是用户态还是内核态抖动 - 配合
watch -n 1 'pidstat -p $(pgrep -f "your_cmd") 1 1 | tail -5',聚焦最近几秒的精细变化 - 真要捕获瞬时尖峰,
perf stat -e cycles,instructions -I 1000比 watch 更底层可靠


















