Задержка выполнения в Linux

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь использовать команду sleep в Linux, которая позволяет вставлять временные задержки в свои скрипты и последовательности команд. Возможность контролировать время выполнения является важной для многих задач скриптинга, таких как создание периодов ожидания между операциями, имитация взаимодействия пользователя или управление потоком выполнения скрипта.

По завершении этого практического занятия вы поймете, как использовать команду sleep как с фиксированными значениями, так и с переменными для создания гибкого управления временными интервалами в своих скриптах оболочки Linux.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux(("Linux")) -.-> linux/VersionControlandTextEditorsGroup(["Version Control and Text Editors"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicSystemCommandsGroup -.-> linux/bc("Arithmetic Calculations") linux/BasicSystemCommandsGroup -.-> linux/sleep("Execution Delaying") linux/BasicFileOperationsGroup -.-> linux/touch("File Creating/Updating") linux/BasicFileOperationsGroup -.-> linux/cut("Text Cutting") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/SystemInformationandMonitoringGroup -.-> linux/date("Date/Time Displaying") linux/VersionControlandTextEditorsGroup -.-> linux/nano("Simple Text Editing") subgraph Lab Skills linux/echo -.-> lab-271383{{"Задержка выполнения в Linux"}} linux/bc -.-> lab-271383{{"Задержка выполнения в Linux"}} linux/sleep -.-> lab-271383{{"Задержка выполнения в Linux"}} linux/touch -.-> lab-271383{{"Задержка выполнения в Linux"}} linux/cut -.-> lab-271383{{"Задержка выполнения в Linux"}} linux/chmod -.-> lab-271383{{"Задержка выполнения в Linux"}} linux/cd -.-> lab-271383{{"Задержка выполнения в Linux"}} linux/date -.-> lab-271383{{"Задержка выполнения в Linux"}} linux/nano -.-> lab-271383{{"Задержка выполнения в Linux"}} end

Понимание команды Sleep

Команда sleep в Linux представляет собой простую, но мощную утилиту, которая приостанавливает выполнение скрипта или последовательности команд на заданный период времени. Это особенно полезно в скриптах оболочки, когда вам нужно создать задержки между командами.

Начнем с изучения базового использования команды 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 на базовом уровне. На следующем этапе мы включим ее в скрипт оболочки.

Создание простого скрипта оболочки с использованием команды Sleep

Теперь, когда вы понимаете, как работает команда sleep, давайте создадим скрипт оболочки, в котором она будет использоваться. Скрипты оболочки позволяют автоматизировать последовательности команд и являются фундаментальным инструментом в администрировании Linux.

Сначала создадим новый файл скрипта оболочки в каталоге вашего проекта:

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.
  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

## 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."

Сохраните файл и выйдите из nano, используя Ctrl+O, Enter и Ctrl+X.

Сделайте скрипт исполняемым:

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 может быть использована в более сложных сценариях скриптинга. Возможность контролировать время является мощным инструментом в скриптинге оболочки, который позволяет реализовать множество практических применений.

Резюме

В этом практическом занятии вы узнали, как использовать команду sleep в Linux для создания временных задержек в своих скриптах оболочки. Это фундаментальный навык для написания скриптов и выполнения операций в командной строке, которые требуют контролируемого времени выполнения.

Основные концепции, рассмотренные в этом практическом занятии:

  1. Базовое использование команды sleep с разными единицами времени (секунды, минуты, часы)
  2. Создание скриптов оболочки, в которых используется команда sleep
  3. Использование переменных для более гибкого и поддерживаемого управления продолжительностью задержек
  4. Выполнение вычислений с переменными, определяющими продолжительность задержек
  5. Практические применения команды sleep:
    • Создание таймеров обратного отсчета
    • Реализация индикаторов прогресса
    • Управление скоростью операций

Эти навыки будут ценными в многих сценариях скриптинга в Linux, включая:

  • Автоматизацию задач, которые требуют определенного времени выполнения
  • Создание удобных для пользователя интерфейсов с соответствующими паузами
  • Реализацию ограничения частоты вызовов API или ресурсоемких операций
  • Имитацию взаимодействия пользователя
  • Управление потоком выполнения скрипта

Освоив команду sleep, вы получили важный инструмент в своем арсенале скриптинга в Linux, который поможет вам создавать более сложные и удобные для пользователя скрипты.