watch 是什么
watch 按固定间隔重复执行一条命令,并把结果全屏刷新,默认间隔 2 秒。它的价值在于把「一段时间的变化」变成「一屏之内能看出来的差异」:-d 会高亮前后两次输出的不同之处,-g 则在输出发生变化时直接退出,方便脚本用它做「等到状态变化」的等待逻辑。它本质上是一个循环加清屏,开销完全取决于你让它跑什么。
基本信息
| 用途 | 周期性执行命令并全屏刷新输出 |
|---|---|
| 语法 | watch [-n 秒] [-d] [-g] '命令' |
| 常用选项 | -n 间隔秒数、-d 高亮差异、-g 输出变化时退出、-e 命令出错时退出、-t 关闭顶部标题 |
| 所属软件包 | procps-ng(多数发行版默认安装) |
典型使用场景
- 盯指标变化:连接数、内存、磁盘占用这类数字,间隔刷新比反复手敲命令省事
- 观察日志增长:用行数变化间接判断写入速率,比 tail 滚屏更直观
- 等待状态翻转:服务重启期间用 -g 等待健康检查返回码变化
- 发布过程盯盘:一边切流一边观察错误率与连接数,及时决定是否回滚
- 演示与教学:把命令的周期性效果直观展示出来
常用示例
常用示例
watch -n 2 'ss -s | grep -i tcp' # 每 2 秒看一次连接统计
watch -d -n 1 'df -h / && free -m | head -3' # 高亮变化,容量与内存一起看
watch -n 5 'wc -l access.log' # 用行数观察日志增长速度
watch -t -n 10 'uptime' # 关掉标题栏,输出更干净
watch -g -n 10 'curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080/health' # 状态变化即退出脚本里当作等待器用
脚本里当作等待器用
# 等待服务健康检查通过(变化即退出,配合超时保护)
timeout 120 watch -g -n 5 'curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080/health'
# 等文件出现后继续执行
timeout 60 watch -g -n 2 'test -f /tmp/ready && echo ready'
# 注意:watch 通过 sh -c 执行命令,整条命令要用引号包住常用选项对照
| 选项 | 作用 | 典型用途 |
|---|---|---|
| -n 秒 | 刷新间隔,默认 2 秒 | 指标类 1 到 2 秒,重命令放长到 5 秒以上 |
| -d | 高亮两次输出的差异 | 在大量文本里快速定位哪一行变了 |
| -g | 输出发生变化时退出 | 脚本里等待状态翻转 |
| -e | 命令返回非零时停止 | 盯关键指标,一异常立刻停下 |
| -t | 关闭顶部标题与时间 | 输出较长、需要更多可见行时 |
watch 通过 shell 执行命令,所以管道、分号、通配符都能用,但整条命令必须用引号包住。不加引号时后半个命令会被 shell 提前解释,行为与预期不同。
放进 watch 的命令要轻:每 2 秒跑一次全量 du 或 find 会持续占用 IO 与 CPU,在生产机上可能自己变成故障源。先估算单次开销再决定间隔。