Linux 执行延迟

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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

在本实验结束时,你将了解如何使用 sleep 命令结合固定值和变量,在你的 Linux shell 脚本中创建灵活的时间控制。

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

理解 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 表示天

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

## Sleep for 5 seconds
echo "Sleeping for 5 seconds..."
sleep 5
echo "Done!"

## Sleep for 0.5 seconds (half a second)
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 的持续时间更灵活。

sleep 命令中使用变量

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

首先,创建一个新文件:

cd ~/project
touch variable_delay.sh

使用 nano 打开文件:

nano variable_delay.sh

添加以下内容:

#!/bin/zsh

## Define delay durations as variables
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 time in seconds
BASE_DELAY=2

echo "Starting script with calculated delays..."

## Using the base delay
echo "Waiting for the base delay (${BASE_DELAY} seconds)..."
sleep $BASE_DELAY
echo "Base delay completed."

## Double the base delay
DOUBLE_DELAY=$((BASE_DELAY * 2))
echo "Waiting for double the base delay (${DOUBLE_DELAY} seconds)..."
sleep $DOUBLE_DELAY
echo "Double delay completed."

## Half the base delay
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

## Function to display a countdown
countdown() {
  local seconds=$1
  while [ $seconds -gt 0 ]; do
    echo -ne "\rTime remaining: $seconds seconds "
    sleep 1
    ((seconds--))
  done
  echo -e "\rCountdown complete!            "
}

## Specify the countdown duration
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

## Function to show a simple progress bar
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!"
}

## Run a process that takes 5 seconds with a progress indicator
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

## Define the rate limit (operations per second)
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"

## Simulate 6 operations with rate limiting
for i in {1..6}; do
  echo "Performing operation $i at $(date +%H:%M:%S.%N | cut -c1-12)"
  ## Simulate the operation
  sleep 0.1
  ## Rate-limiting delay between operations
  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. 使用变量让 sleep 持续时间更具灵活性和可维护性
  4. sleep 持续时间变量进行计算
  5. sleep 命令的实际应用:
    • 创建倒计时器
    • 实现进度指示器
    • 控制操作速率

这些技能在许多 Linux 脚本编写场景中都非常有用,包括:

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

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