Иногда вам может понадобиться установить таймаут для команды или программы Linux и завершить ее, если выполнение продолжается после истечения таймаута. Вы можете легко сделать это с помощью команды timeout, которая уже установлена по умолчанию в большинстве дистрибутивов Linux. Она позволяет установить значение тайм-аута практически для каждого скрипта, команды и программы. Она особенно полезна для программ, которые не имеют встроенного механизма тайм-аута.
Команда тайм-аута в Linux
Здесь описано, как использовать команду timeout в Linux. Вот синтаксис команды timeout.
1 | timeout [ОПЦИИ] ДЛИТЕЛЬНОСТЬ КОМАНДЫ [АРГУМЕНТЫ] ... |
Длительность может быть целым числом или числом с плавающей точкой, за которым по желанию следует единица времени.
- s - секунды (по умолчанию)
- m - минуты
- h - часы
- d - дни
Если единица измерения не указана, считаются секунды. Если вы установите длительность равной нулю, то тайм-аут будет отключен. Команду или сценарий для тайм-аута следует указывать только после того, как вы указали опции и длительность команды тайм-аута. Вот несколько примеров для начала работы.
Вот команда для завершения выполнения через 5 секунд.
1 | timeout 5 ping 8.8.8.8 |
А вот команда, завершающая выполнение через 10 секунд.
1 | timeout 10s ping 8.8.8.8 |
Вот команда для завершения выполнения через 2 минуты 30 секунд.
1 | timeout 2.5m ping 8.8.8.8 |
Если вам нужно разрешение sudo для выполнения вашей команды, вам нужно указать его перед командой timeout.
1 | sudo timeout 300 tcpdump -n -w data.pcap |
Команда timeout позволяет посылать определенные сигналы по истечении периода таймаута. По умолчанию она посылает команду SIGTERM при достижении лимита времени. Вместо этого вы можете послать сигнал SIGKILL, используя опцию -s.
1 | sudo timeout -s SIGKILL ping 8.8.8.8 |
Кроме того, вы можете указать номер сигнала, например 9.
1 | sudo timeout -s 9 ping 8.8.8.8 |
Сигнал SIGTERM, посылаемый командой timeout, может быть проигнорирован некоторыми процессами. В таких случаях вы можете указать команде timeout послать команду SIGKILL через другой промежуток времени, используя опцию -k. Вот команда, посылающая сигнал SIGTERM через 1 минуту, а затем посылающая команду SIGKILL через 10 секунд, в случае, если процесс не будет завершен.
1 | sudo timeout -k 10 1m ping 8.8.8.8 |
Команда timeout возвращает статус exist 124 в случае, если таймаут достигнут, в противном случае она возвращает статус выхода из команды. Если вы хотите зафиксировать статус выхода, вы можете сделать это с помощью опции -preserve-status.
1 | timeout --preserve-status 5 ping 8.8.8.8 |
Еще один момент, о котором следует помнить: по умолчанию команда timeout запускает отслеживаемую команду в фоновом режиме. Если вы хотите запустить ее на переднем плане, то вам нужно использовать опцию -foreground.
1 | timeout --foreground 5m ./script.sh |
Timeout - это очень полезная команда, которая позволяет легко устанавливать таймауты и предотвращать процессы от ненужного запуска в течение длительного времени и потребления системных ресурсов.