timeout
Команда timeout позволяет задать максимальное время выполнения любого другого процесса. При превышении указанного лимита команда посылает сигнал завершения (по умолчанию SIGTERM) или другой, который вы укажете. Это особенно полезно в скриптах автоматизации, где необходимо гарантировать, что задачи не застрянут и не потребуют ручного вмешательства.
Ключевые возможности
- Ограничение времени работы программы.
- Возможность указать сигнал завершения (например,
SIGKILL). - Поддержка таймаутов в миллисекундах с помощью суффикса
m. - Вывод сообщения об истечении срока, если процесс не завершился.
Как использовать timeout
Синтаксис
timeout [опции] время команда [аргументы]Время может быть задано в секундах (s), минутах (m), часах (h) или днях (d). Если суффикса нет, считается секунды.
Пример 1: Обычный таймаут
timeout 30 ping -c 5 google.comЕсли ping не завершится за 30 секунд, команда посылает SIGTERM.
Пример 2: Таймаут с пользовательским сигналом
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. Однако это может привести к некорректному состоянию файловой системы или незаписанным данным.
Практические советы по применению
- Автоматическое завершение зависших процессов
В CI/CD пайплайнах часто встречаются задачи, которые могут «зависнуть» из‑за сетевых задержек. Добавьтеtimeoutв скрипт сборки:
timeout 5m ./run_tests.sh || echo "Tests timed out"- Параллельные запросы с ограничением времени
Если вы запускаете несколько долгих команд одновременно, оберните каждую вtimeoutи запустите через&. Это предотвратит «потерю» ресурсов, если одна из задач выйдет за пределы допустимого времени.
timeout 2m ./heavy_task_1.sh &
timeout 2m ./heavy_task_2.sh &
waitИспользование timeout в Linux значительно повышает надёжность автоматизированных процессов, позволяя избежать зависаний и гарантировать своевременное завершение задач. Понимание её параметров и механизмов работы поможет вам писать более устойчивые скрипты и конфигурации.