Timeout команды в Linux

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




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



2022-06-13T23:55:52
Утилиты командной строки