timeout
это утилита командной строки, которая запускает указанную команду и завершает ее, если она все еще выполняется по истечении заданного периода времени. Другими словами, timeout
позволяет запустить команду с ограничением по времени. Эта timeout
команда является частью пакета основных утилит GNU, который установлен практически в любом дистрибутиве Linux.
Это удобно, когда вы хотите запустить команду, которая не имеет встроенной опции тайм-аута.
В этой статье мы объясним, как использовать команду Linux timeout
.
Как использовать timeout
команду
Синтаксис timeout
команды следующий:
timeout [OPTIONS] DURATION COMMAND [ARG]…
Копировать
Может DURATION
быть положительным целым числом или числом с плавающей запятой, за которым следует необязательный суффикс единицы измерения:
s
— секунды (по умолчанию)m
— минутh
— часыd
— дней
Когда единицы измерения не используются, по умолчанию используются секунды. Если для длительности установлено нулевое значение, соответствующий тайм-аут отключен.
Параметры команды должны быть указаны перед аргументами.
Вот несколько основных примеров, демонстрирующих использование timeout
команды:
- Завершить команду через пять секунд:
timeout 5 ping 8.8.8.8
Копировать - Завершить команду через пять минут:
timeout 5m ping 8.8.8.8
Копировать - Завершить команду через одну минуту и шесть секунд:
timeout 1.1m ping 8.8.8.8
Копировать
Если вы хотите запустить команду, требующую повышенных привилегий, например tcpdump
, добавьте sudo
перед timeout
:
sudo timeout 300 tcpdump -n -w data.pcap
Отправка определенного сигнала
Если сигнал не подан, timeout
отправляет SIGTERM
сигнал управляемой команде, когда достигается лимит времени. Вы можете указать, какой сигнал отправлять, используя опцию -s
( ).--signal
Например, чтобы отправить SIGKILL
команду ping
через одну минуту, вы должны использовать:
sudo timeout -s SIGKILL ping 8.8.8.8
Вы можете указать сигнал по имени, например SIGKILL
, или по его номеру, например 9
. Следующая команда идентична предыдущей:
sudo timeout -s 9 ping 8.8.8.8
Чтобы получить список всех доступных сигналов, используйте kill -l
команду:
kill -l
Уничтожение зависших процессов
SIGTERM
, сигнал по умолчанию, отправляемый при превышении лимита времени, может быть перехвачен или проигнорирован некоторыми процессами. В таких ситуациях процесс продолжает выполняться после отправки сигнала завершения.
Чтобы убедиться, что отслеживаемая команда уничтожена, используйте параметр -k
( --kill-after
), за которым следует период времени. Когда эта опция используется после достижения заданного срока, timeout
команда отправляет SIGKILL
управляемой программе сигнал, который нельзя перехватить или проигнорировать.
В следующем примере timeout
команда выполняется в течение одной минуты, и если она не будет завершена, она будет уничтожена через десять секунд:
sudo timeout -k 10 1m ping 8.8.8.8
тайм-аут -k «./test.sh»
убит после достижения заданного срока
Сохранение статуса выхода
timeout
возвращается 124
, когда лимит времени достигнут. В противном случае он возвращает статус выхода управляемой команды.
Чтобы вернуть статус выхода команды даже при достижении лимита времени, используйте --preserve-status
опцию:
timeout --preserve-status 5 ping 8.8.8.8
Бег на переднем плане
По умолчанию timeout
запускает управляемую команду в фоновом режиме. Если вы хотите запустить команду на переднем плане, используйте --foreground
опцию:
timeout --foreground 5m ./script.sh
Этот параметр полезен, когда вы хотите запустить интерактивную команду, требующую ввода данных пользователем.
Вывод
Команда timeout
используется для запуска данной команды с ограничением по времени.
timeout
это простая команда, которая не имеет большого количества опций. Обычно вы будете вызывать timeout
только с двумя аргументами: продолжительностью и управляемой командой.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.