Команда Linux timeout
timeout — практичная команда в системах Linux, используемая для завершения выполняющихся команд по истечении заданного времени. Эта команда особенно подходит для следующих сценариев:
- Ограничение длительно выполняющихся процессов
- Предотвращение бесконечного выполнения скриптов или программ
- Установка ограничений времени выполнения для критичных операций
- Контроль тайм-аутов в автоматизированном тестировании
Команда timeout входит в пакет GNU coreutils и предустановлена в большинстве дистрибутивов Linux.
Синтаксис команды
Базовый синтаксис команды timeout выглядит следующим образом:
timeout [选项] 持续时间 命令 [参数...]
Описание параметра
-
Длительность:
- Может быть просто числом (единица по умолчанию — секунды)
- Также можно указать единицу измерения:
10s(10 секунд),5m(5 минут),1h(1 час) - Поддерживаются десятичные дроби:
0.5s(500 миллисекунд),1.5m(1 минута 30 секунд)
-
Команда:
- Команда или программа для выполнения
- Может быть встроенной командой или внешней программой
-
Parameters:
- Аргументы, передаваемые команде
Общие параметры
| Опция | Описание | Пример |
|---|---|---|
-sили--signal |
Укажите сигнал, отправляемый после тайм-аута (по умолчанию — TERM) | timeout -s KILL 5s command |
-kили--kill-after |
Если первоначальный сигнал неэффективен, отправьте сигнал KILL через указанное время | timeout -k 5s 10s command |
--preserve-status |
Вернуть статус выхода завершённой команды | timeout --preserve-status 5s command |
--foreground |
Запустить команду на переднем плане (по умолчанию — в фоновом режиме) | timeout --foreground 5s command |
-vили--verbose |
Показывать подробный вывод | timeout -v 5s command |
Примеры использования
Базовое использование
Пример
timeout 5s ping example.com
# Завершить выполнение скрипта через 1 минуту
timeout 1m ./long_script.sh
Указание типа сигнала
Пример
timeout -s INT 3s command
# Отправить сигнал KILL через 10 секунд (принудительное завершение)
timeout -s KILL 10s команда
Комбинированное использование
Пример
timeout -k 5s 10s команда
Получение статуса завершения
Пример
timeout --preserve-status 5s команда
echo $? # Просмотреть код статуса завершения
Практические сценарии применения
1. Предотвращение бесконечного выполнения скрипта
Пример
timeout 2h ./backup_database.sh
2. Управление тайм-аутами в автоматизированном тестировании
Пример
timeout 30s ./run_test_case.sh
3. Тайм-аут сетевой операции
Пример
timeout 1m wget http://example.com/large_file.zip
4. Обработка тайм-аутов для интерактивных программ
Пример
timeout 10s read -p "Введите ваш выбор: " choice
Примечания
-
Обработка сигналов:
- Некоторые программы могут перехватывать и игнорировать сигнал TERM; в этом случае нужен сигнал KILL
- Используйте сигнал KILL с осторожностью во время важных операций с данными, так как он может привести к повреждению данных
-
Обработка дочерних процессов:
- По умолчанию timeout завершает только процесс, который он непосредственно запустил, а не обязательно все дочерние процессы
- Чтобы завершить всё дерево процессов, рассмотрите возможность комбинирования с
killкомандой
-
Точность времени:
- Точность времени ядра Linux обычно находится на уровне миллисекунд
- Очень короткие интервалы времени (например, 0.001s) могут не поддаваться точному управлению
-
Возвращаемые значения:
- Если команда завершается до истечения тайм-аута, возвращается статус завершения команды
- Если завершение произошло из-за тайм-аута, возвращается 124
- Если сама команда timeout сталкивается с ошибкой, возвращается 125-128
Дополнительные советы
1. Комбинирование с другими командами
Пример
timeout 30s command || echo "Время выполнения команды истекло, выполняется очистка..."
2. Использование в скриптах
Пример
if timeout 10s command; then
echo "Команда успешно завершена"
else
echo "Время выполнения команды истекло или произошла ошибка"
fi
3. Мониторинг использования ресурсов
Пример
(ulimit -t 10; timeout 20s command)
ЧАВО
Вопрос 1: В чём разница между timeout и sleep?
Ответ: sleep просто ожидает заданное время, тогда как timeout ограничивает время выполнения другой команды.
Вопрос 2: Как завершить все дочерние процессы, запущенные timeout?
Ответ: Можно использовать метод группы процессов:
timeout --foreground 10s sh -c 'command & wait'
Вопрос 3: Почему моя программа не завершается сразу после timeout?
A: Возможно, это произошло потому, что программа перехватила сигнал TERM по умолчанию; попробуйте использовать-s KILLпараметр.
Q4: Как определить, была ли команда завершена из-за тайм-аута?
A: Проверьте, равен ли код состояния выхода 124:
Пример
if [ $? -eq 124 ]; then
echo "Команда завершена из-за тайм-аута"
fi
Итог
Команда timeout — очень полезный инструмент в администрировании систем Linux; она может помочь нам:
- Контролировать время выполнения программы, чтобы предотвратить длительное занятие ресурсов
- Повысить надёжность сценариев и избежать бесконечного ожидания
- Реализовать механизмы тайм-аута в автоматизированных задачах
- Обрабатывать операции с непредсказуемым временем выполнения
Правильно используя команду timeout, вы можете сделать администрирование системы Linux более эффективным и надёжным.
Другие расширения
Справочник команд Linux