timeout

Команда timeout позволяет задать максимальное время выполнения любого другого процесса. При превышении указанного лимита команда посылает сигнал завершения (по умолчанию SIGTERM) или другой, который вы укажете. Это особенно полезно в скриптах автоматизации, где необходимо гарантировать, что задачи не застрянут и не потребуют ручного вмешательства.

Ключевые возможности

  • Ограничение времени работы программы.
  • Возможность указать сигнал завершения (например, SIGKILL).
  • Поддержка таймаутов в миллисекундах с помощью суффикса m.
  • Вывод сообщения об истечении срока, если процесс не завершился.

Как использовать timeout

Синтаксис

Bash
timeout [опции] время команда [аргументы]

Время может быть задано в секундах (s), минутах (m), часах (h) или днях (d). Если суффикса нет, считается секунды.

Пример 1: Обычный таймаут

Bash
timeout 30 ping -c 5 google.com

Если ping не завершится за 30 секунд, команда посылает SIGTERM.

Пример 2: Таймаут с пользовательским сигналом

Bash
timeout --signal=SIGKILL 10s ./long_task.sh

Сигнал SIGKILL убивает процесс мгновенно, без возможности корректного завершения.

Параметры, которые стоит знать

  • -k, --kill-after=DURATION: время, через которое будет послан сигнал SIGKILL, если процесс всё ещё жив.
  • -s, --signal=SIGNAL: сигнал, который посылается при истечении таймаута.
  • --preserve-status: сохраняет код выхода процесса, даже если он завершён из‑за таймаута.

Технические детали работы

Команда timeout реализована как небольшая оболочка над системными вызовами fork(), execve() и kill(). При запуске она создаёт дочерний процесс, который выполняет заданную команду. В родительском процессе запускается таймер (alarm() или setitimer()), после которого посылается сигнал завершения.

Если вы используете опцию --preserve-status, то код выхода будет равен коду, возвращённому дочерним процессом, даже если он был убит. Это удобно для проверки конкретных сценариев в тестах.

Почему важно учитывать сигналы

Некоторые процессы могут перехватывать сигнал SIGTERM и выполнять очистку. Если вы хотите принудительно завершить работу, используйте SIGKILL. Однако это может привести к некорректному состоянию файловой системы или незаписанным данным.

Практические советы по применению

  1. Автоматическое завершение зависших процессов
    В CI/CD пайплайнах часто встречаются задачи, которые могут «зависнуть» из‑за сетевых задержек. Добавьте timeout в скрипт сборки:
Bash
timeout 5m ./run_tests.sh || echo "Tests timed out"
  1. Параллельные запросы с ограничением времени
    Если вы запускаете несколько долгих команд одновременно, оберните каждую в timeout и запустите через &. Это предотвратит «потерю» ресурсов, если одна из задач выйдет за пределы допустимого времени.
Bash
timeout 2m ./heavy_task_1.sh & 
timeout 2m ./heavy_task_2.sh & 
wait

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