watch -n 1 无法直接写文件,但可通过重定向(如 'uptime >> /tmp/load.log 2>&1')或 tee(如 'uptime | tee -a /tmp/load.log')实现每秒监控并追加记录,推荐结合 date 添加时间戳提升日志可分析性。

直接用 watch -n 1 无法同步输出到文件,因为 watch 默认只刷新屏幕,不写磁盘。但可以通过组合命令实现“每秒监控负载 + 实时追加记录”的效果。
核心思路:用 watch 触发,靠重定向或 tee 落盘
watch 本身不支持直接写文件,但它会周期性执行命令。只要让被监控的命令把结果输出到文件,就达成目标。常用两种方式:
-
方式一(推荐):在 watch 内部用重定向
例如:watch -n 1 'uptime >> /tmp/load.log 2>&1'
每秒执行一次uptime,并把输出追加进日志。注意加2>&1可捕获错误(如权限不足)。 -
方式二:用 tee 分流显示+写入
例如:watch -n 1 'uptime | tee -a /tmp/load.log'
终端仍能看到实时输出,同时自动追加到文件。比纯重定向更直观。
监控什么?选对命令很关键
系统负载最常用的是 /proc/loadavg 或 uptime,它们轻量、无依赖、输出稳定:
-
cat /proc/loadavg→ 输出类似0.42 0.38 0.35 1/1234 56789,前三字段是 1/5/15 分钟平均负载 -
uptime→ 输出含负载信息,如..., load average: 0.42, 0.38, 0.35,可读性更强 - 避免用
top -b -n1或htop:体积大、含控制字符、易导致日志混乱
增强实用性的小技巧
让日志更易分析,建议加上时间戳和格式控制:
- 带精确时间戳:
watch -n 1 'echo "$(date +\"%F %T\") $(cat /proc/loadavg)" >> /tmp/load.log'
输出形如:2026-04-29 01:05:22 0.42 0.38 0.35 1/1234 56789 - 限制日志大小防膨胀:
可用logrotate管理,或简单用tail -n 1000 /tmp/load.log > /tmp/load.log.tmp && mv /tmp/load.log.tmp /tmp/load.log定期截断 - 加高亮看变化(仅终端):
watch -n 1 -d 'uptime'→ 终端里负载数字跳变时会闪色,方便肉眼捕捉突增
注意事项
几个容易踩的坑要避开:
- 别用 -n 0.1 或 -n 0.5:负载采样本身毫秒级完成,太密反而增加调度开销,1秒足够反映趋势
-
路径要有写权限:确保
/tmp/load.log所在目录当前用户可写,否则日志为空 -
Ctrl+C 退出 watch 后,日志写入立即停止:它不会后台驻留;如需长期采集,请改用
systemd timer或简单 while 循环 - 不建议在 watch 中调用 tail -f、ping 等长时进程:watch 每次都 fork 新进程,可能残留,且与“每秒快照”逻辑冲突


















