linux bash scripting

sleep

Приостановка выполнения на заданное время — пауза между командами в скриптах

Описание

sleep — простая утилита, которая приостанавливает выполнение на указанный промежуток времени. Без аргументов — ошибка; с числом — пауза в секундах по умолчанию. Суффикс задаёт единицу времени: s (секунды), m (минуты), h (часы), d (дни).

Команда широко применяется в bash-скриптах: задержка между действиями, бесконечные циклы-мониторы (while true; do ... && sleep 1; done), создание последовательности файлов с разными временными метками, ожидание перед следующей командой.

Можно передать несколько аргументов — sleep 1m 30s выдержит паузу 1 минута 30 секунд. Дробные значения допустимы: sleep 0.5 — полсекунды.

Синтаксис

sleep NUMBER[SUFFIX]

Можно указать несколько аргументов — они суммируются:

sleep 1m 30s # пауза 1 мин 30 сек (= 90 сек) sleep 2h 30m # пауза 2,5 часа sleep 0.5 # полсекунды

Суффиксы времени

Суффикс Единица Пример
s Секунды (по умолчанию; суффикс можно не указывать) sleep 10s или sleep 10
m Минуты sleep 5m
h Часы sleep 2h
d Дни sleep 1d
Дробные значения: sleep 0.5 — 500 мс; sleep 1.5m — 90 секунд. Полезно для точных пауз между запросами к API или в тестах.

Паттерны использования

Бесконечный цикл-монитор

# Вывод сообщения каждую секунду
while true; do
  echo "Alive"
  sleep 1
done

# Короткая форма
while true; do echo "Alive" && sleep 1; done

Классический паттерн наблюдения: повторять действие до прерывания (Ctrl+C).

Создание файлов с разными временными метками

for i in {1..5}; do
  touch "file_$i.txt"
  sleep 1
done

Пауза 1 секунда обеспечивает разные значения mtime у созданных файлов.

Ожидание перед командой

# Подождать 5 секунд и продолжить
echo "Starting in 5 seconds..."
sleep 5
echo "Starting now!"

# Задержка между попытками
for i in {1..3}; do
  ping -c 1 example.com
  sleep 2
done

Пауза перед запуском сервиса или повторными попытками подключения.

Скрипт создания файлов с датой

#!/bin/bash
# create_dated_files.sh
DATE=$(date '+%d-%m-%y')
for i in {1..5}; do
  echo "log entry $i" > "log_${DATE}_$i.txt"
  sleep 1
done

Из лекции (урок 15): создание лог-файлов с временными метками через паузы.

Совмещение нескольких аргументов

# Пауза 1 минута 30 секунд
sleep 1m 30s

# Пауза 2 часа (в скрипте резервного копирования)
echo "Backup complete. Next in 2 hours."
sleep 2h

Несколько аргументов суммируются — удобно вместо перевода в секунды вручную.

Цикл while с условием и sleep

#!/bin/bash
# wait_for_file.sh
counter=0
while [ ! -f /tmp/ready.flag ]; do
  echo "Waiting... ($counter sec)"
  sleep 1
  ((counter++))
done
echo "File appeared, continuing."

Ожидание появления файла-флага: цикл проверяет условие раз в секунду.

Минимальный рабочий пример

Скрипт с паузами, демонстрирующий все ключевые варианты sleep:

#!/bin/bash # demo_sleep.sh echo "Step 1: start" sleep 2 # пауза 2 секунды echo "Step 2: after 2s" sleep 0.5 # пауза 500 мс echo "Step 3: quick pause done" sleep 1m 10s # пауза 1 мин 10 сек (70 сек) echo "Done."

Запуск:

chmod +x demo_sleep.sh ./demo_sleep.sh

После запуска терминал молчит на 2 секунды, затем выводит «Step 2», ещё мгновение — «Step 3», затем долгая пауза 70 секунд и «Done».

Советы

Совет: прервать sleep можно по Ctrl+C
Если скрипт завис на sleep, нажмите Ctrl+C — это прерывает весь скрипт. Чтобы прервать только sleep и продолжить выполнение, используйте sleep 60 & (в фоне) и wait.
Совет: sleep в бесконечных циклах
В цикле while true; do echo "check" && sleep 1; done пауза обязательна — без неё цикл загружает CPU на 100%. Даже sleep 0.1 резко снижает нагрузку.
Внимание: sleep на Windows не поддерживает суффиксы m/h/d
На Windows (CMD/PowerShell) sleep — другая команда: только секунды, суффиксы не работают. В Git Bash и WSL поведение аналогично Linux. В bash-скриптах для Linux это не проблема.