Команда Linux timeout

Linux 命令大全Справочник команд Linux


timeout — практичная команда в системах Linux, используемая для завершения выполняющихся команд по истечении заданного времени. Эта команда особенно подходит для следующих сценариев:

  • Ограничение длительно выполняющихся процессов
  • Предотвращение бесконечного выполнения скриптов или программ
  • Установка ограничений времени выполнения для критичных операций
  • Контроль тайм-аутов в автоматизированном тестировании

Команда timeout входит в пакет GNU coreutils и предустановлена в большинстве дистрибутивов Linux.


Синтаксис команды

Базовый синтаксис команды timeout выглядит следующим образом:

timeout [选项] 持续时间 命令 [参数...]

Описание параметра

  1. Длительность:

    • Может быть просто числом (единица по умолчанию — секунды)
    • Также можно указать единицу измерения:10s(10 секунд),5m(5 минут),1h(1 час)
    • Поддерживаются десятичные дроби:0.5s(500 миллисекунд),1.5m(1 минута 30 секунд)
  2. Команда:

    • Команда или программа для выполнения
    • Может быть встроенной командой или внешней программой
  3. 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

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

Базовое использование

Пример

# Завершить команду ping через 5 секунд
timeout 5s ping example.com

# Завершить выполнение скрипта через 1 минуту
timeout 1m ./long_script.sh

Указание типа сигнала

Пример

# Отправить сигнал INT через 3 секунды (эквивалентно Ctrl+C)
timeout -s INT 3s command

# Отправить сигнал KILL через 10 секунд (принудительное завершение)
timeout -s KILL 10s команда

Комбинированное использование

Пример

# Сначала отправить сигнал TERM, затем отправить сигнал KILL через 5 секунд
timeout -k 5s 10s команда

Получение статуса завершения

Пример

# Сохранить статус завершения завершённой команды
timeout --preserve-status 5s команда
echo $?  # Просмотреть код статуса завершения

Практические сценарии применения

1. Предотвращение бесконечного выполнения скрипта

Пример

# Ограничить выполнение скрипта резервного копирования базы данных максимум 2 часами
timeout 2h ./backup_database.sh

2. Управление тайм-аутами в автоматизированном тестировании

Пример

# Пусть тестовый сценарий выполняется не более 30 секунд
timeout 30s ./run_test_case.sh

3. Тайм-аут сетевой операции

Пример

# Попробуйте скачать файл не более чем за 1 минуту
timeout 1m wget http://example.com/large_file.zip

4. Обработка тайм-аутов для интерактивных программ

Пример

# Предоставьте пользователю не более 10 секунд на ввод выбора
timeout 10s read -p "Введите ваш выбор: " choice

Примечания

  1. Обработка сигналов:

    • Некоторые программы могут перехватывать и игнорировать сигнал TERM; в этом случае нужен сигнал KILL
    • Используйте сигнал KILL с осторожностью во время важных операций с данными, так как он может привести к повреждению данных
  2. Обработка дочерних процессов:

    • По умолчанию timeout завершает только процесс, который он непосредственно запустил, а не обязательно все дочерние процессы
    • Чтобы завершить всё дерево процессов, рассмотрите возможность комбинирования сkillкомандой
  3. Точность времени:

    • Точность времени ядра Linux обычно находится на уровне миллисекунд
    • Очень короткие интервалы времени (например, 0.001s) могут не поддаваться точному управлению
  4. Возвращаемые значения:

    • Если команда завершается до истечения тайм-аута, возвращается статус завершения команды
    • Если завершение произошло из-за тайм-аута, возвращается 124
    • Если сама команда timeout сталкивается с ошибкой, возвращается 125-128

Дополнительные советы

1. Комбинирование с другими командами

Пример

# Выполнить операции очистки после тайм-аута
timeout 30s command || echo "Время выполнения команды истекло, выполняется очистка..."

2. Использование в скриптах

Пример

#!/bin/bash

if timeout 10s command; then
    echo "Команда успешно завершена"
else
    echo "Время выполнения команды истекло или произошла ошибка"
fi

3. Мониторинг использования ресурсов

Пример

# Ограничить время CPU (требуется в сочетании с ulimit)
(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:

Пример

timeout 5s slow_command
if [ $? -eq 124 ]; then
    echo "Команда завершена из-за тайм-аута"
fi

Итог

Команда timeout — очень полезный инструмент в администрировании систем Linux; она может помочь нам:

  1. Контролировать время выполнения программы, чтобы предотвратить длительное занятие ресурсов
  2. Повысить надёжность сценариев и избежать бесконечного ожидания
  3. Реализовать механизмы тайм-аута в автоматизированных задачах
  4. Обрабатывать операции с непредсказуемым временем выполнения

Правильно используя команду timeout, вы можете сделать администрирование системы Linux более эффективным и надёжным.


Linux 命令大全Справочник команд Linux

Другие расширения