如何在 Linux 上使用 Watch 命令定期运行程序

在日常使用中,我们有时需要重复执行某些命令或程序,以便持续监控系统的状态,例如正在运行的进程、硬盘空间的使用情况或是用户的登录信息。Linux 的 watch 命令就可以帮助我们自动化完成这些任务,而无需手动反复输入命令。

通过 watch 命令,我们可以实时监视系统的各种活动,例如用户的登录、网络状态、内存和 CPU 的使用情况以及磁盘空间等。接下来,让我们深入了解一下如何在 Linux 系统中使用 watch 命令。

什么是 watch 命令?

watch 命令是一个 Linux 实用工具,它可以按照指定的时间间隔重复执行一个命令或程序,并在终端中显示其输出结果。这使得我们可以实时观察输出的变化。每次执行后,watch 命令都会刷新输出,覆盖之前的显示内容。默认情况下,watch 命令每两秒重复执行一次,并且会一直运行,直到我们使用 Ctrl + C 手动停止它。

watch 命令的语法

watch 命令的基本语法如下:

 watch [选项] <命令> 

watch 命令提供了多种命令行选项。如果不带任何选项运行 watch 命令,它将默认每两秒执行一次指定的命令。例如,以下命令将会显示 ls 命令的输出:

 watch ls -l ~/ 

如果我们在目录中创建、删除文件或者更改文件大小,输出结果将实时显示目录列表的变化,并且每两秒刷新一次。

使用 watch 命令每 X 秒运行一次命令

我们可以自定义 watch 命令的更新间隔。也就是说,我们可以设置 watch 命令在两次执行命令之间等待的时间(以秒为单位)。要更改更新间隔,可以使用 -n 选项,后跟需要的时间间隔(以秒为单位)。

 watch -n <间隔时间(秒)> <命令> 

例如,如果要每 5 秒运行一次命令,可以执行以下命令:

 watch -n 5 <命令> 

突出显示更新之间的变化

watch 命令默认会每次刷新时覆盖输出。但是,使用 -d 选项,我们可以高亮显示上一次输出和当前输出之间的差异。

 watch -d <命令> 

隐藏 watch 命令输出中的标题

默认情况下,watch 命令会在每次输出的顶部显示一个标题,其中包含了更新间隔、命令名称以及系统的当前日期和时间。我们可以使用 -t 选项来隐藏标题:

 watch -t <命令> 

出错时发出蜂鸣声

当 Linux 进程完成运行时,它会返回一个退出代码。按照惯例,返回值为 0 表示成功,非零值表示错误。如果 watch 命令执行的命令返回非零退出代码,watch 命令的 -b 选项将发出蜂鸣声。

例如,假设我们需要监视 sshd.service 服务并在服务停止时收到通知。我们可以使用以下命令:

 watch -b sudo systemctl status sshd.service 

当服务停止时,此命令会发出蜂鸣声。当服务恢复正常运行时,蜂鸣声将会停止。为了测试此功能,我们可以打开另一个终端窗口并停止服务。这将发出持续的蜂鸣声,直到我们再次启动服务。需要注意的是,要使用此功能,我们的系统上必须安装 beep 软件包。

当输出变化时退出 watch 命令

我们也可以设置 watch 命令在命令的输出发生变化时停止运行并退出。我们可以使用 -g 选项来实现此目的。当我们等待输出中出现特定变化时,此选项非常有用。

一旦输出发生改变,watch 命令就会停止运行。我们可以结合使用此功能和 echo 命令,以便在屏幕上显示一条消息。

例如,假设我们正在等待某个文件出现在特定目录中。以下命令将会监视指定文件的目录。一旦文件出现,watch 命令将会停止运行,并在终端上显示消息 “file arrived”。

 watch -g "ls -l | grep filename" && echo "file arrived" 

另一个有用的例子是,当特定用户登录系统时发出通知:

 watch -g "who | grep username" && echo "username logged in" 

这个命令会监视 who 命令的输出,who 命令会列出当前已登录的用户。当用户登录后,watch 命令将会停止运行,并在终端上显示一条消息。

类似地,当文件发生特定变化时,我们也可以指示 watch 命令停止运行。请注意,在使用管道命令链时,我们需要将整个命令用引号括起来。

监视 Linux 系统中的活动

如果我们发现自己需要重复执行相同的操作,可以考虑使用 watch 命令来自动化这些操作。这样我们就无需频繁地输入命令来查看更新的内容。

我们还可以将 watch 命令与其他 Linux 命令结合使用,以监视系统资源和活动,并跟踪文件或目录的更改。