timeout
— это служебная программа командной строки, которая запускает указанную команду и завершает ее, если она все еще выполняется по истечении заданного периода времени. Другими словами, timeout
позволяет запускать команду с ограничением по времени. Команда timeout
является частью пакета основных утилит GNU, который устанавливается практически в любом дистрибутиве Linux.
Это удобно, когда вы хотите запустить команду, у которой нет встроенной опции тайм-аута.
В этой статье мы объясним, как использовать команду timeout
Linux.
Содержание
Как использовать команду 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
когда timeout
срок. В противном случае он возвращает статус завершения управляемой команды.
Чтобы вернуть статус выхода команды даже при достижении лимита времени, используйте параметр --preserve-status
:
timeout --preserve-status 5 ping 8.8.8.8
Бег на переднем плане
По умолчанию timeout
запускает управляемую команду в фоновом режиме. Если вы хотите запустить команду на переднем плане, используйте параметр --foreground
:
timeout --foreground 5m ./script.sh
Эта опция полезна, когда вы хотите запустить интерактивную команду, требующую ввода данных пользователем.
Выводы
Команда timeout
используется для выполнения заданной команды с ограничением по времени.
timeout
— это простая команда, у которой не так много параметров. Обычно вы вызываете timeout
только с двумя аргументами: длительностью и управляемой командой.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.