Linux 命令重复执行

LinuxBeginner
立即练习

介绍

watch 命令是 Linux 系统中一个强大的实用工具,它允许用户定期执行命令并在终端上显示其输出。该工具在监控系统资源、跟踪文件更改或观察任何定期产生输出的进程时特别有用。

在这个实验中,你将学习如何使用 watch 命令来自动化重复性任务并监控系统变化。你将了解其语法、选项以及在实际场景中的应用。在本实验结束时,你将能够设置自动化监控进程,以有效地观察系统中的变化。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 100%。获得了学习者 100% 的好评率。

理解 watch 命令基础

watch 命令允许你按指定的时间间隔重复运行另一个命令。当你需要监控不断变化的情况或随时间观察命令的输出时,这个命令非常有用。

让我们从探索 watch 命令的基本语法开始:

watch [options] command

常见的选项包括:

  • -n <seconds>:以秒为单位指定更新间隔(默认是 2 秒)
  • -d:突出显示每次更新之间的变化
  • -t:关闭显示命令和当前时间的标题

让我们创建一个简单的示例来演示 watch 是如何工作的。首先,导航到你的工作目录:

cd ~/project

现在,让我们创建一个简单的脚本,每次运行时生成一个随机数。这将帮助我们直观地看到 watch 是如何重复执行命令的。创建一个名为 generate_number.sh 的文件,内容如下:

nano ~/project/generate_number.sh

在 nano 编辑器中,输入以下内容:

#!/bin/bash
echo "Random number: $((RANDOM % 100 + 1))" > ~/project/number.txt
cat ~/project/number.txt

Ctrl+O 然后按 Enter 保存文件,再按 Ctrl+X 退出 nano。

现在让脚本可执行:

chmod +x ~/project/generate_number.sh

让我们运行一次脚本,看看它的作用:

~/project/generate_number.sh

输出应该显示一个 1 到 100 之间的随机数。

现在,让我们使用 watch 命令每 3 秒运行一次这个脚本:

watch -n 3 ~/project/generate_number.sh

你会看到命令输出每 3 秒刷新一次,每次显示一个新的随机数。顶部的标题显示正在执行的命令和当前时间。

要退出 watch 命令,按 Ctrl+C

让我们尝试另一个使用 -d 选项来突出显示变化的示例:

watch -n 3 -d ~/project/generate_number.sh

注意每次更新时输出中的变化是如何被突出显示的。当监控大量输出并且你需要快速识别哪些内容发生了变化时,这特别有用。

使用 watch 监控系统资源

watch 命令最常见的用途之一是监控系统资源。在这一步中,你将学习如何使用 watch 来监控一些基本的系统信息。

让我们首先使用 free 命令来监控系统的内存使用情况:

watch -n 2 free -m

上述命令将以兆字节(-m)为单位显示内存使用情况,并每 2 秒刷新一次输出。这对于随时间监控内存消耗很有用。

Ctrl+C 退出 watch 命令。

现在,让我们监控磁盘使用情况:

watch -n 5 df -h

此命令以人类可读的格式(-h)显示磁盘使用情况,并每 5 秒更新一次。你可以看到系统不同分区上的可用空间和已使用空间。

Ctrl+C 退出 watch 命令。

让我们通过监控系统上正在运行的进程来探索另一个有用的应用:

watch -n 3 "ps aux | head -10"

此命令显示按 CPU 使用情况排序的前 10 个进程,并每 3 秒更新一次。注意,我们将复杂的命令用引号括起来,以便它能与 watch 正确配合使用。

Ctrl+C 退出 watch 命令。

让我们创建一个特定的目录来监控文件更改:

mkdir -p ~/project/monitor_dir
touch ~/project/monitor_dir/file1.txt

现在,让我们使用 watch 来监控该目录的任何更改:

watch -n 2 "ls -l ~/project/monitor_dir"

让这个命令在你的终端中保持运行。现在,打开一个新的终端,并在被监控的目录中创建一个新文件:

touch ~/project/monitor_dir/file2.txt

观察第一个终端中的 watch 命令如何自动更新以显示新文件。这展示了如何使用 watch 实时监控目录更改。

在第一个终端中按 Ctrl+C 退出 watch 命令。

watch 命令高级特性

在这一步中,你将了解 watch 命令的一些高级特性,这些特性可以让你的监控任务更加高效。

让我们先探索 -t 选项,该选项可以关闭显示命令和当前时间的标题:

watch -n 3 -t date

注意,现在标题已被隐藏,显示界面更加简洁,只专注于命令输出。当你想最大化利用屏幕空间来显示输出时,这个选项很有用。

Ctrl+C 退出。

接下来,让我们看看如何结合 -g--chgexit 选项使用 watch。这个选项会让 watch 在命令输出发生变化时退出:

touch ~/project/test_change.txt
watch -g -n 1 "ls -l ~/project/test_change.txt"

当这个命令运行时,打开一个新的终端并修改该文件:

echo "hello" > ~/project/test_change.txt

当第一个终端中的 watch 命令检测到文件发生变化时,它会自动退出。

让我们创建一个更实际的示例。我们将创建一个脚本,模拟一个偶尔会出现错误的日志文件:

nano ~/project/simulate_logs.sh

在 nano 编辑器中,输入以下内容:

#!/bin/bash
LOG_FILE=~/project/application.log

## Initialize log file
echo "Starting log simulation" > $LOG_FILE

## Generate simulated log entries
for i in {1..10}; do
  echo "[$(date)] - INFO: Normal operation $i" >> $LOG_FILE
  sleep 1

  ## Occasionally generate an error
  if ((i % 3 == 0)); then
    echo "[$(date)] - ERROR: Something went wrong!" >> $LOG_FILE
  fi
done

echo "Log simulation complete" >> $LOG_FILE

保存并退出 nano(Ctrl+O,回车,Ctrl+X),然后让脚本可执行:

chmod +x ~/project/simulate_logs.sh

现在,让我们结合 grep 使用 watch 来监控日志文件中的错误消息:

watch -n 1 "grep ERROR ~/project/application.log || echo 'No errors found'"

在另一个终端中,运行日志模拟脚本:

~/project/simulate_logs.sh

观察第一个终端如何在日志文件中出现错误消息时进行显示。这是一个使用 watch 实时监控日志的实际示例。

Ctrl+C 退出 watch 命令。

最后,让我们看看如何在后台运行 watch 并将其输出重定向到一个文件:

watch -n 5 date > ~/project/date_output.txt 2>&1 &

这个命令会在后台运行 watch 命令,每 5 秒更新一次日期,并将输出保存到一个文件中。你可以查看文件内容:

cat ~/project/date_output.txt

要停止后台的 watch 进程,找到它的 PID 并终止它:

ps aux | grep "watch -n 5 date"
kill <PID>  ## Replace <PID> with the actual process ID number

这些示例展示了 watch 命令在各种监控任务中的多功能性。

总结

在本次实验中,你学习了如何在 Linux 中使用 watch 命令以指定的时间间隔重复执行命令。这个强大的实用工具可用于各种监控任务,对系统管理员和 Linux 用户来说都是必不可少的工具。

本次实验涵盖的关键概念如下:

  1. watch 命令的基本用法,以及 -n(用于指定时间间隔)和 -d(用于突出显示变化)等各种选项的使用。
  2. 结合 freedfps 等命令,使用 watch 监控系统资源,如内存使用情况、磁盘空间和正在运行的进程。
  3. 使用 watch 实时监控文件和目录的变化。
  4. watch 的高级特性,包括无标题运行(-t)、检测到变化时退出(-g),以及与其他命令结合以满足特定的监控需求。
  5. 在后台运行 watch 并将其输出重定向到文件。

当你需要监控不断变化的情况或自动刷新命令输出时,watch 命令是一个多功能的工具,可以为你节省时间和精力。它能够与任何产生终端输出的命令配合使用,使其适用于从系统管理到应用程序开发和调试等广泛的场景。