作为 Linux 运维工程师或日常使用者,我们经常需要反复执行同一条命令,等待某个状态发生变化。比如,在文件拷贝过程中查看磁盘空间变化、等待服务启动完成,或是排查网络连接问题时持续观察端口状态。
手动每隔几秒敲一次相同的命令,不仅繁琐,还容易遗漏关键变化。这时候,watch 命令就派上用场了。
它能按固定间隔自动重复执行任意 Linux 命令,并实时刷新终端输出。更棒的是,它还能高亮显示两次刷新之间的差异,让你无需编写脚本,就能直观地实时监控系统状态。
举个例子:你肯定经历过在拷贝大文件或备份数据时,反复执行 df -h,等几秒再执行一次。现在,watch 可以帮你自动完成这个重复劳动,实时更新显示,让你一眼就能看出哪里发生了变化。
本文将通过多个实用案例,教你如何使用 watch 命令实时监控磁盘使用率、服务状态、日志文件等系统活动。
1.watch 命令的作用
watch 命令会按固定时间间隔重复执行指定命令,并用最新输出刷新终端。默认每 2 秒执行一次,非常适合需要持续观察系统变化的场景。
watch 工具在 Debian 系发行版中属于 procps 软件包,在 RHEL 系发行版中属于 procps-ng。大多数 Linux 系统默认已安装。如果执行 which watch 没有返回路径,可通过对应包管理器安装。
本文在 Ubuntu 26.04 和 Rocky Linux 10 上进行了验证,但 watch 命令在绝大多数现代 Linux 发行版中的行为都是一致的。
2.基本语法
基本语法格式如下:
watch [选项] 命令
默认情况下,watch 每 2 秒重复执行指定命令,并用最新结果刷新屏幕。
示例:
watch df -h
说明:
-h 选项以人类可读格式(如 MB、GB)显示磁盘容量
按 Ctrl+C 可随时停止 watch。
注意:watch 运行期间的输出仅显示在屏幕上。由于它是直接刷新屏幕而非保留历史记录,输出不会自动保存到任何地方,除非你显式重定向到文件或使用日志工具。
运行效果示例:
Every 2.0s: df -h Wed Aug 12 14:26:49 2026
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 3.9G 4.2M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda2 93G 11G 83G 11% /
/dev/mapper/backupvg-backuplv 3.0T 7.7G 3.0T 1% /backup
/dev/mapper/oradatavg-oradatalv 1000G 9.9G 990G 1% /oradata
/dev/mapper/centos-oracle 200G 19G 182G 10% /oracle
/dev/mapper/archivevg-archivelv 489G 3.8G 485G 1% /archive
tmpfs 781M 0 781M 0% /run/user/0
3.实战案例
案例 1:文件拷贝时监控磁盘空间
假设你正在将一个大文件从 /tmp 拷贝到挂载的 NFS 共享目录,需要同时监控源目录和目标目录的可用空间。
watch -n 1 df -h /tmp /mnt/nfs-share
参数说明:
df -h /tmp /mnt/nfs-share:只显示源目录和目标目录的文件系统使用情况
随着拷贝进行,你会看到目标文件系统的 已用空间(Used) 逐渐增加,可用空间(Avail) 逐渐减少。
同时监控两个文件系统,既能确认拷贝确实在进行,也能在磁盘空间不足导致操作失败前及时发现问题。
案例 2:高亮显示变化内容
假设你在排查一个服务异常开启或关闭网络端口的问题。与其手动对比每次 ss 命令的输出,不如让 watch 自动帮你标出变化。
watch -d ss -tunlp
参数说明:
-d:高亮显示当前屏幕与上一次屏幕之间的差异,变化一目了然ss -tunlp:显示所有活跃的 TCP 和 UDP 套接字,并显示关联的进程名
当服务启动、停止或建立新连接时,watch 会自动高亮受影响的行,让你无需逐行对比,立刻就能定位变化。
案例 3:自定义刷新间隔
在监控系统高负载场景时,默认的 2 秒刷新间隔可能不足以捕捉到快速变化,比如 CPU 温度骤升。
watch -n 0.5 sensors
参数说明:
-n 0.5:将刷新间隔设为 0.5 秒(支持小数)sensors:显示硬件传感器信息,包括 CPU 和系统温度
注意: 实际刷新频率受命令执行时间限制。如果 sensors 本身需要 400 毫秒才能执行完毕,那么即使设置 -n 0.1,输出也不会比命令实际执行更快。
案例 4:输出变化时自动退出
重启服务后,你可能希望等待服务完全启动后再执行后续操作。与其反复手动检查状态,不如让 watch 在状态变化时自动退出。
watch -g -n 2 'systemctl is-active nginx'
参数说明:
-g(或 --chgexit):当命令输出与首次执行的结果不同时,watch 自动退出systemctl is-active nginx:返回服务当前状态(active、inactive、failed 等)
一旦服务从初始状态(如 activating)变为 active,watch 会自动退出。这在需要等待服务就绪后再执行下一步操作时非常有用。
配合后续命令使用:
watch -g 'systemctl is-active nginx' && echo"Nginx 已就绪!"
服务变为活跃状态后,watch 退出,后面的命令会自动执行。
案例 5:实时监控日志新增条目
更新 Web 服务器或反向代理配置后,你可能需要在发送测试请求的同时,密切关注错误日志。与其反复执行 tail,不如用 watch 自动刷新最新日志。
watch -n 1 -d 'tail -n 20 /var/log/nginx/error.log'
参数说明:
tail -n 20:每次显示日志文件最后 20 行-d:高亮显示与上次刷新相比发生变化的行,新日志条目一目了然
注意: 这不是 tail -f 的替代品。tail -f 会持续流式输出新到达的日志并完整保留内容;而 watch 提供的是最新日志的"快照刷新",更适合在测试配置变更时,快速确认是否有新的错误产生。
4.常见使用误区
使用 watch 命令时,以下几点需要特别注意:
(1) 管道命令忘记加引号
执行 watch df -h | grep sda 时,管道符 | 是在 watch 外部生效的,也就是把 watch 的屏幕输出传给 grep,这通常不是你想要的效果。正确做法是将整个命令用引号括起来,让 watch 将其作为单个命令执行:
watch 'df -h | grep sda'
(2) 刷新间隔设置过短
如果命令本身的执行时间超过了设定的刷新间隔,watch 无法按预期频率更新。例如,某命令执行需要 3 秒,那么即使设置 -n 1,也无法实现每秒更新。
(3) 误以为有历史记录或滚动回溯
watch 每次刷新都会替换屏幕上的旧输出,不会保留历史。如果需要保存每一行输出,应将命令重定向到文件,或使用 tail -f 等工具监控日志。
(4) 对交互式程序使用 watch
top、htop、vim、nano 等程序自身管理全屏界面,不适合在 watch 中运行。这类程序应直接单独执行。
5.watch 与 Bash 循环、Cron 的对比
watch 并非重复执行命令的唯一方式,但在交互式实时监控场景下,它通常是最简洁的选择。
Bash 循环 例如:
whiletrue; do
command
sleep 2
done
虽然也能实现重复执行,但需要编写脚本或输入循环结构。对于临时性的交互监控,watch 一条命令就能搞定。
Cron 任务 则用途不同。它用于在预定时间自动执行命令(通常间隔几分钟或几小时),且无需用户登录即可在后台运行。它不适合在终端上持续刷新显示。
使用建议:
- 需要保存输出、发送告警、后台自动执行 → 用 Bash 脚本或 Cron
6.总结
watch 命令通过按固定间隔自动重复执行任意 Linux 命令,让系统监控变得简单高效。无论是查看磁盘空间、观察服务启动,还是监控日志文件,它都能提供实时视图,无需编写脚本。
本文还介绍了如何通过 -n 自定义刷新间隔、用 -d 高亮差异、以及用 -g 在输出变化时自动退出。