В Bash иногда требуется выполнить команду, которая требует много времени для завершения, а ждать ее завершения бесконечно не хочется. Одним из решений этой проблемы является использование команды timeout, которая ограничивает время выполнения команды. В этой статье мы рассмотрим, как сделать таймаут команды в Bash без лишних задержек.
Тайм-аут команды в Bash
Чтобы отключить команду в Bash, мы можем использовать команду "timeout". Команда "timeout" доступна по умолчанию не во всех системах, но ее можно установить с помощью менеджера пакетов в большинстве дистрибутивов Linux. Ниже приведен синтаксис команды "timeout":
1 | timeout [OPTION] DURATION COMMAND [ARG] |
Здесь "OPTION" - это необязательный аргумент, определяющий поведение команды timeout, "DURATION" - это время выполнения команды, а "COMMAND [ARG]" - это команда и ее аргументы, которые мы хотим выполнить.
Например, допустим, мы хотим выполнить команду "sleep" в течение пяти секунд, но хотим сделать тайм-аут команды через три секунды, и вот пример сценария оболочки:
1 2 3 4 | #!/bin/bash echo "Запуск команды sleep с таймаутом 3 секунды..." timeout 3s sleep 5s echo "Команда сна завершена" |
Здесь я указал длительность таймаута 3 секунды, а длительность команды "sleep" - 5 секунд. Команда "timeout" остановит выполнение команды "sleep" через 3 секунды, хотя обычно команда "sleep" выполняется в течение 5 секунд.
Чтобы избежать лишних задержек при использовании команды "timeout", можно воспользоваться опцией "-k". Опция "-k" задает сигнал, который будет послан команде, если она превысит установленный лимит таймаута. Этот сигнал приведет к немедленному завершению команды, а не к ожиданию ее изящного завершения.
Например, допустим, мы хотим выполнить команду "sleep" в течение пяти секунд, но при превышении лимита тайм-аута через три секунды отправить сигнал SIGINT. Это можно сделать, выполнив следующую команду:
1 2 3 4 | #!/bin/bash echo "Запуск команды sleep с таймаутом 3 секунды и сигналом SIGINT через 2 секунды" timeout -k 2s 3s sleep 5s echo "Команда сна завершена" |
Здесь я указал длительность таймаута 3 секунды и сигнал SIGINT, который будет отправлен при превышении лимита таймаута. Опция "-k 2s" указывает, что сигнал SIGINT должен быть послан после двух секунд превышения таймаута.
Заключение
Таймаут команды в Bash - это полезный инструмент, позволяющий более эффективно выполнять команды и предотвращать ненужные задержки. Используя команду "timeout" и опцию "-k", можно ограничить время выполнения команды и послать сигнал о ее немедленном завершении, если она превысит установленный лимит времени. Это поможет сэкономить время и более эффективно выполнять скрипты.