Команда timeout в Linux

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 только с двумя аргументами: длительностью и управляемой командой.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Оставьте комментарий