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