← LeisureLinux 文章索引
LeisureLinux · 微信公众号文章

watch 命令完全指南:别再用 while true 手敲了

Linux/运维 阅读原文(微信)↗

别再用 while true 写死循环了——watch 这条被严重低估的命令,能把你的终端变成一台实时监控面板。——基于 Tecmint 权威指南

你有没有过这样的经历:拷贝大文件的时候反复敲 df -h,每隔几秒一次,就为了看看磁盘空间还剩多少?排查网络问题时,不停打 ss -tunlp 看端口变化?

这种重复劳动,有一句行话叫「人肉 cron」——低效、易出错、还伤手腕。而 Linux 早就给你准备好了答案:watch 命令

它能把任何 Linux 命令变成自动刷新、高亮变化的实时监控面板,一句命令顶一百次手动操作。

本文看点

01

五大实战场景——磁盘监控、端口追踪、温度监测、服务等待、日志快照

02

关键参数深度解析——[-n] 刷新间隔、[-d] 差异高亮、[-g] 条件退出

03

常见踩坑——管道引号、间隔过短、交互程序兼容性

01

ANATOMY

watch 命令解剖:它到底干了什么

watch 的核心逻辑极其简单:按固定间隔重复执行一条命令,并全屏刷新输出。默认每 2 秒执行一次。它属于 procps / procps-ng 包,绝大多数 Linux 发行版预装。

1

Debian/Ubuntu:sudo apt install procps

2

RHEL/Rocky:sudo dnf install procps-ng

基础语法

watch [options] command

默认行为

每 2 秒执行一次命令,全屏刷新。按 Ctrl+C 退出。输出不保留历史记录,只显示当前最新结果。

Hello World

watch df -h

这一条命令等价于:你每 2 秒手动敲一次 df -h,但不会在终端留下满屏历史——watch 会直接把旧输出替换掉,干净利落。

02

EXAMPLES

五大实战场景

EXAMPLE 1监控磁盘使用:拷贝文件时的救命稻草

你正在往 NFS 挂载点拷贝一个大文件,需要同时盯住源盘和目标盘的剩余空间。

watch -n 1 df -h /tmp /mnt/nfs-share

参数解读

-n 1 将刷新间隔从默认 2 秒缩短到 1 秒;df -h /tmp /mnt/nfs-share 只显示这两个挂载点。随着拷贝进行,Used 列会实时增长,在空间耗尽之前你就能采取行动。

EXAMPLE 2高亮差异追踪:一眼看出谁在开端口

排查网络问题时,你需要知道哪个进程正在监听哪个端口——而且需要一眼看到变化。

watch -d ss -tunlp

关键参数:-d

-d(difference)会把本次输出与上一次不同的行高亮标记出来。服务启动、端口打开、连接建立——变化一目了然,无需肉眼逐行比对。

EXAMPLE 3自定义刷新间隔:捕捉毫秒级变化

高负载场景下,默认 2 秒间隔可能漏掉关键数据——比如 CPU 温度尖峰。

watch -n 0.5 sensors

⚠️ -n 支持小数秒,但实际刷新频率受限于命令自身的执行时长。如果 sensors 本身需要 400ms 才能跑完,设 -n 0.1 不会让它更快。

EXAMPLE 4条件退出:等服务就绪再跑下一步

重启 nginx 后,你想等服务完全启动再继续操作。传统做法是反复敲 systemctl status nginx。watch 的 -g 参数可以自动完成这个等待。

watch -g \'systemctl is-active nginx\' && echo 「Nginx 已就绪!」

关键参数:-g

-g(\——chgexit):输出一旦与首次不同,立即退出。配合 && 可实现「等待条件满足 → 自动执行下一步」的自动化流水线。

EXAMPLE 5日志快照监控:改配置后的实时反馈

改完 nginx 配置后发测试请求,想实时看错误日志有没有新条目。

watch -n 1 -d \'tail -n 20 /var/log/nginx/error.log\'

watch vs tail -f

注意:这不是替代 tail -f。tail -f 持续流式输出,保留全部历史;watch 只是定时拍快照。适合「改配置→测试→看一眼有没有新错误」这种快速反馈循环。

03

GOTCHAS

常见踩坑与避坑指南

GOTCHA 1管道忘了引号——最常见错误

你本意是让 watch 重复执行 df -h | grep sda,但写了:


watch df -h | grep sda ← 错误!

Shell 会把 | 解释为:先跑 watch df -h,再把它的屏幕输出 pipe 给 grep——这完全不是你要的。正确写法:


watch \'df -h | grep sda\' ← 正确!用引号包裹整条管道

GOTCHA 2刷新间隔过短——设了也没用

如果命令本身跑一次需要 3 秒,设 -n 1 不会产生每秒一次的输出。watch 的最小有效间隔 =命令自身的执行时长。

GOTCHA 3别在 watch 里跑交互程序

top、htop、vim、nano 这类自己管理全屏界面的程序,不适合放在 watch 里——它们会和 watch 的屏幕刷新机制产生冲突。直接用这些程序就好,别套娃。

GOTCHA 4别指望滚屏历史——watch 是快照,不是录像

watch 每次都替换上一屏的输出,没有 scrollback。如果需要保存每一条输出,请重定向到文件:

watch -n 5 \'date >> /tmp/timestamps.log\'

04

COMPARISON

watch vs while 循环 vs cron:该选谁

他们都能周期执行命令,但定位截然不同:

方案 场景 优势
watch 交互式实时监控 一行命令,高亮变化,随时 Ctrl+C 退出
while 循环 需要记录输出或发告警 灵活控制逻辑,可记录/告警/条件分支
cron 无人值守后台定时任务 掉线也跑,按日历调度,适合分钟/小时级

实时盯着看 → watch;需要存下来 → while;无人值守跑 → cron。

THE END

总结

watch 命令把「重复执行 + 全屏刷新 + 差异高亮」三个动作合为一句命令。它不能替代 cron 的定时调度,也不能替代 while 循环的脚本灵活性——但当你只是想在终端里盯着某个命令的输出看变化时,watch 就是那个最趁手的工具。

1

-n 控制刷新间隔,支持小数秒

2

-d 高亮变化行,不用肉眼 Diff

3

-g 输出变化时自动退出,配合 && 实现流水线

4

管道命令用\'\' 或 \"\" 包裹

下次又准备写 while true; do ... sleep 2; done 的时候,先想想:watch 够不够用?

END

如果你觉得今天这篇有收获,欢迎点赞、在看、转发三连,我们下篇见。

tmux 3.7 重磅发布:浮动窗格、复制模式行号、焦点跟随鼠标等新特性详解

手搓微型 Linux 发行版:从零开始打造你的专属系统

深度长文 | eBPF 前世今生:从 30 年前的"抓包小弟"到 2026 年监控界的"上帝之手"

常见问题(FAQ)

Q1:这篇文章主要讲什么? 别再用 while true 写死循环了——watch 这条被严重低估的命令,能把你的终端变成一台实时监控面板。 Q2:「watch 命令解剖:它到底干了什么」这部分主要讲了什么? watch 的核心逻辑极其简单:按固定间隔重复执行一条命令,并全屏刷新输出。 Q3:「五大实战场景」这部分主要讲了什么? 02 Q4:「常见踩坑与避坑指南」这部分主要讲了什么? GOTCHA 1管道忘了引号——最常见错误 Q5:「watch vs while 循环 vs cron:该选谁」这部分主要讲了什么? 他们都能周期执行命令,但定位截然不同:

本文整理自微信公众号 LeisureLinux 的原创内容(Linux / AI / 安全 硬核技术)。

· 阅读原文(微信公众号)

· 关注公众号 LeisureLinux,第一时间获取技术深度内容。

LeisureLinux 公众号二维码(微信扫一扫关注)