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
timeout -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 только с двумя аргументами, продолжительностью и управляемой командой.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.