Linux 执行延迟

LinuxBeginner
立即练习

简介

在本实验中,你将学习如何在 Linux 中使用 sleep 命令,该命令允许你在脚本和命令序列中引入定时暂停或延迟。控制时序的能力对于许多脚本任务至关重要,例如在操作之间创建等待期、模拟用户交互或控制脚本执行流程。

完成本实验后,你将了解如何使用固定值和变量来使用 sleep 命令,从而在 Linux Shell 脚本中创建灵活的时序控制。

理解 Sleep 命令

Linux 中的 sleep 命令是一个简单但功能强大的工具,用于将脚本或命令序列的执行暂停指定的时间。这在 Shell 脚本中非常有用,特别是当你需要在命令之间创建延迟时。

让我们先探索 sleep 命令的基本用法。

首先,进入你的项目目录:

cd ~/project

现在,让我们直接在终端中使用 sleep 命令。输入以下命令:

echo "Start time: $(date +%H:%M:%S)"
sleep 3
echo "End time: $(date +%H:%M:%S)"

当你执行此命令序列时,你将看到打印出的开始时间,随后是 3 秒的暂停,最后是结束时间。输出结果类似于:

Start time: 10:15:30
End time: 10:15:33

sleep 命令的基本语法为:

sleep NUMBER[SUFFIX]

其中:

  • NUMBER 是要休眠的时间量
  • SUFFIX 是可选的,可以是:
    • s 代表秒(如果不指定后缀,则默认为秒)
    • m 代表分钟
    • h 代表小时
    • d 代表天

让我们尝试几个示例,看看不同的时间单位是如何工作的:

## 休眠 5 秒
echo "Sleeping for 5 seconds..."
sleep 5
echo "Done!"

## 休眠 0.5 秒(半秒)
echo "Sleeping for half a second..."
sleep 0.5
echo "Done!"

现在你已经了解了 sleep 命令的基本工作原理。在下一步中,我们将把它整合到 Shell 脚本中。

创建带有 Sleep 的基础 Shell 脚本

既然你已经了解了 sleep 命令的工作原理,让我们创建一个使用它的 Shell 脚本。Shell 脚本允许你自动化命令序列,是 Linux 管理中的一项基础工具。

首先,在你的项目目录中创建一个新的 Shell 脚本文件:

cd ~/project
touch delay_script.sh

接下来,使用 nano 文本编辑器打开该文件:

nano delay_script.sh

向文件中添加以下内容:

#!/bin/zsh

echo "Starting the script..."
echo "First message appears immediately."
sleep 2
echo "Second message appears after 2 seconds."
sleep 3
echo "Third message appears after 3 more seconds."
echo "Script execution complete."

要在 nano 中保存文件,请按 Ctrl+O,然后按 Enter 确认,最后按 Ctrl+X 退出编辑器。

在运行脚本之前,我们需要使其可执行:

chmod +x delay_script.sh

现在,运行该脚本:

./delay_script.sh

你应该会看到消息按指定的延迟出现:

Starting the script...
First message appears immediately.
Second message appears after 2 seconds.
Third message appears after 3 more seconds.
Script execution complete.

这个简单的脚本演示了如何使用 sleep 命令来控制消息显示的计时。这种技术在许多脚本场景中非常有用,例如:

  1. 模拟用户交互
  2. 等待进程完成
  3. 创建进度指示器
  4. 对操作进行速率限制

让我们逐行分析脚本的作用:

  1. #!/bin/zsh - 这被称为 shebang 行,指定该脚本应使用 zsh shell 执行。
  2. echo "Starting the script..." - 打印初始消息。
  3. echo "First message appears immediately." - 立即打印第一条消息。
  4. sleep 2 - 将脚本执行暂停 2 秒。
  5. echo "Second message appears after 2 seconds." - 在 2 秒延迟后打印第二条消息。
  6. sleep 3 - 将脚本执行再暂停 3 秒。
  7. echo "Third message appears after 3 more seconds." - 在 3 秒延迟后打印第三条消息。
  8. echo "Script execution complete." - 打印最终消息。

在下一步中,我们将探索如何通过使用变量使休眠时长更加灵活。

在 Sleep 命令中使用变量

在实际脚本中,你通常需要比硬编码的休眠时长更灵活的控制。使用变量来设置休眠时间可以使你的脚本更具适应性和可维护性。让我们创建一个演示此概念的新脚本。

首先,创建一个新文件:

cd ~/project
touch variable_delay.sh

使用 nano 打开该文件:

nano variable_delay.sh

添加以下内容:

#!/bin/zsh

## 定义延迟时长作为变量
SHORT_DELAY=1
MEDIUM_DELAY=3
LONG_DELAY=5

echo "Starting the script with variable delays..."

echo "This is displayed immediately."
echo "Waiting for a short delay (${SHORT_DELAY} seconds)..."
sleep $SHORT_DELAY
echo "Short delay completed."

echo "Waiting for a medium delay (${MEDIUM_DELAY} seconds)..."
sleep $MEDIUM_DELAY
echo "Medium delay completed."

echo "Waiting for a long delay (${LONG_DELAY} seconds)..."
sleep $LONG_DELAY
echo "Long delay completed."

echo "Script execution complete."

使用 Ctrl+OEnterCtrl+X 保存并退出 nano。

使脚本可执行:

chmod +x variable_delay.sh

现在运行脚本:

./variable_delay.sh

输出结果将类似于:

Starting the script with variable delays...
This is displayed immediately.
Waiting for a short delay (1 seconds)...
Short delay completed.
Waiting for a medium delay (3 seconds)...
Medium delay completed.
Waiting for a long delay (5 seconds)...
Long delay completed.
Script execution complete.

让我们了解一下为什么使用变量来设置延迟时间是有益的:

  1. 可读性:使用像 SHORT_DELAY 这样具有描述性的变量名,使代码能够自解释。
  2. 可维护性:如果你需要更改延迟时间,只需在一个地方(变量声明处)进行修改,而不是在整个脚本中到处修改。
  3. 一致性:如果同一个延迟时长被多次使用,使用变量可以确保所有实例都使用相同的值。
  4. 灵活性:你可以通过仅修改变量值来轻松更改延迟时间。

你还可以对这些变量进行计算。让我们再创建一个脚本来演示:

cd ~/project
touch calculated_delay.sh
nano calculated_delay.sh

添加以下内容:

#!/bin/zsh

## 基础延迟时间(秒)
BASE_DELAY=2

echo "Starting script with calculated delays..."

## 使用基础延迟
echo "Waiting for the base delay (${BASE_DELAY} seconds)..."
sleep $BASE_DELAY
echo "Base delay completed."

## 基础延迟的两倍
DOUBLE_DELAY=$((BASE_DELAY * 2))
echo "Waiting for double the base delay (${DOUBLE_DELAY} seconds)..."
sleep $DOUBLE_DELAY
echo "Double delay completed."

## 基础延迟的一半
HALF_DELAY=$(echo "scale=1; $BASE_DELAY / 2" | bc)
echo "Waiting for half the base delay (${HALF_DELAY} seconds)..."
sleep $HALF_DELAY
echo "Half delay completed."

echo "Script execution complete."

保存、退出 nano 并使脚本可执行:

chmod +x calculated_delay.sh

运行脚本:

./calculated_delay.sh

输出结果将类似于:

Starting script with calculated delays...
Waiting for the base delay (2 seconds)...
Base delay completed.
Waiting for double the base delay (4 seconds)...
Double delay completed.
Waiting for half the base delay (1.0 seconds)...
Half delay completed.
Script execution complete.

这演示了如何根据单个基础值动态计算延迟时间,使你的脚本更加灵活和强大。

Sleep 命令的实际应用

既然你已经了解了 sleep 命令的基础知识以及如何结合变量使用它,让我们探索一些实际应用。这些示例演示了 sleep 命令在现实场景中是如何使用的。

创建简单的倒计时计时器

让我们创建一个倒计时计时器,演示 sleep 命令的一种更复杂的用法:

cd ~/project
touch countdown.sh
nano countdown.sh

添加以下内容:

#!/bin/zsh

## 显示倒计时的函数
countdown() {
  local seconds=$1
  while [ $seconds -gt 0 ]; do
    echo -ne "\rTime remaining: $seconds seconds "
    sleep 1
    ((seconds--))
  done
  echo -e "\rCountdown complete!            "
}

## 指定倒计时时长
echo "Starting a 5-second countdown:"
countdown 5
echo "Countdown script execution complete."

保存、退出 nano 并使脚本可执行:

chmod +x countdown.sh

运行脚本:

./countdown.sh

你应该会看到从 5 秒到 0 的倒计时,时间在原地更新:

Starting a 5-second countdown:
Time remaining: 5 seconds
Time remaining: 4 seconds
Time remaining: 3 seconds
Time remaining: 2 seconds
Time remaining: 1 seconds
Countdown complete!
Countdown script execution complete.

模拟带有进度指示器的进程

让我们创建一个脚本,模拟一个长时间运行的进程,并带有简单的进度指示器:

cd ~/project
touch progress.sh
nano progress.sh

添加以下内容:

#!/bin/zsh

## 显示简单进度条的函数
show_progress() {
  local duration=$1
  local steps=10
  local step_duration=$(echo "scale=2; $duration / $steps" | bc)

  echo "Starting process..."
  echo -n "Progress: ["
  for i in {1..10}; do
    sleep $step_duration
    echo -n "#"
  done
  echo "] Done!"
}

## 运行一个耗时 5 秒并带有进度指示器的进程
show_progress 5
echo "Process completed successfully."

保存、退出 nano 并使脚本可执行:

chmod +x progress.sh

运行脚本:

./progress.sh

你应该会看到一个在 5 秒内填满的进度条:

Starting process...
Progress: [##########] Done!
Process completed successfully.

控制操作速率

在此示例中,我们将演示如何使用 sleep 命令来控制操作速率,这对于限制 API 调用速率或处理大数据集非常有用:

cd ~/project
touch rate_limit.sh
nano rate_limit.sh

添加以下内容:

#!/bin/zsh

## 定义速率限制(每秒操作数)
OPERATIONS_PER_SECOND=2
SLEEP_DURATION=$(echo "scale=3; 1 / $OPERATIONS_PER_SECOND" | bc)

echo "Performing operations at a rate of $OPERATIONS_PER_SECOND per second"
echo "Each operation will be followed by a $SLEEP_DURATION second delay"

## 模拟 6 次速率受限的操作
for i in {1..6}; do
  echo "Performing operation $i at $(date +%H:%M:%S.%N | cut -c1-12)"
  ## 模拟操作
  sleep 0.1
  ## 操作之间的速率限制延迟
  if [ $i -lt 6 ]; then
    sleep $SLEEP_DURATION
  fi
done

echo "All operations completed"

保存、退出 nano 并使脚本可执行:

chmod +x rate_limit.sh

运行脚本:

./rate_limit.sh

你应该会看到操作以受控的速率执行:

Performing operations at a rate of 2 per second
Each operation will be followed by a 0.500 second delay
Performing operation 1 at 10:30:45.12
Performing operation 2 at 10:30:45.72
Performing operation 3 at 10:30:46.32
Performing operation 4 at 10:30:46.92
Performing operation 5 at 10:30:47.52
Performing operation 6 at 10:30:48.12
All operations completed

这些示例演示了 sleep 命令如何在更高级的脚本场景中使用。控制时序的能力是 Shell 脚本中的一项强大工具,能够实现许多实际应用。

总结

在本实验中,你学习了如何在 Linux 中使用 sleep 命令在 Shell 脚本中引入定时延迟。这是编写脚本和进行需要受控时序的命令行操作的一项基本技能。

本实验涵盖的关键概念:

  1. sleep 命令在不同时间单位(秒、分钟、小时)下的基本用法
  2. 创建包含 sleep 命令的 Shell 脚本
  3. 使用变量使休眠时长更灵活、更易于维护
  4. 对休眠时长变量进行计算
  5. sleep 命令的实际应用:
    • 创建倒计时计时器
    • 实现进度指示器
    • 控制操作速率

这些技能在许多 Linux 脚本场景中都很有价值,包括:

  • 自动化需要特定时序的任务
  • 创建带有适当暂停的用户友好界面
  • 为 API 调用或资源密集型操作实现速率限制
  • 模拟用户交互
  • 管理脚本执行流程

通过掌握 sleep 命令,你现在拥有了 Linux 脚本工具箱中的一项重要工具,它将帮助你创建更复杂、更用户友好的脚本。