Как использовать команду timeout в Linux

Фатмавати Ахмад Заенури/Shutterstock.com

Хорошо, хватит компьютерного времени. Вы можете задать ограничения времени процессов, задав максимальное время, в течение которого они могут работать, с помощью команды timeout . Вот руководство по установке ограничений на запуск программ с помощью этой команды.

Что делает для вас тайм-аут?

Команда timeout позволяет вам установить ограничение продолжительности работы программы. Но почему вы хотите это сделать?

Один случай, когда вы точно знаете, как долго вы хотите запустить процесс. Распространенным вариантом использования является timeout , управляющий программой ведения журнала или сбора данных, чтобы файлы журнала не могли постоянно поглощать пространство на жестком диске.

Другой случай, когда вы не знаете, как долго вы хотите запускать процесс, но знаете, что не хотите, чтобы он работал бесконечно. У вас может быть привычка запускать процессы, свернуть окно терминала и забыть о них.

Некоторые программы – даже простые утилиты – могут генерировать сетевой трафик на уровнях, которые могут снизить производительность вашей сети. Или они могут связать ресурсы на целевом устройстве, снижая его производительность. ( ping , я смотрю на вас.) Не рекомендуется оставлять такие программы запущенными в течение длительного времени, пока вы не находитесь за компьютером.

timeout является частью GNU Core Utils, поэтому в Linux и Unix-подобных операционных системах, таких как macOS, встроен тайм-аут. Устанавливать нечего; Вы можете использовать его прямо из коробки.

Начало работы с таймаутом

Вот простой пример. Например, с параметрами командной строки по умолчанию команда ping будет выполняться до тех пор, пока вы не остановите ее, нажав Ctrl + C. Если вы не прервете это, оно просто продолжит.

 ping 192.168.4.28 

Используя timeout , мы можем убедиться, что ping не запускается и не включается, проверяя пропускную способность сети и приставая к любому устройству, испытывающему ping.

Следующая команда использует timeout для ограничения по времени ping . Мы даем 15 секунд времени выполнения для ping .

 тайм-аут 15 пинг 192.168.4.28 

Через 15 секунд timeout завершает сеанс ping , и мы возвращаемся к приглашению командной строки.

Использование тайм-аута с другими единицами времени

Обратите внимание, что нам не нужно было добавлять «s» после 15. timeout предполагает, что значение указано в секундах. Вы можете добавить «s», но это действительно не имеет значения.

Чтобы использовать значение времени, измеренное в минутах, часах или днях, добавьте «m», «h» или «d».

Чтобы пинг выполнялся в течение трех минут, используйте следующую команду:

 тайм-аут 3 м пинг 192.168.4.28 

ping будет работать в течение трех минут, прежде чем timeout вступит в действие и остановит сеанс ping .

Ограничение сбора данных с таймаутом

Некоторые файлы захвата данных могут расти очень быстро. Чтобы такие файлы не становились громоздкими или даже проблематичными по размеру, ограничьте время, которое разрешено запускать программе захвата.

В этом примере мы используем tcpdump , инструмент захвата сетевого трафика. На тестовых компьютерах, на которых исследовалась эта статья, tcpdump уже был установлен в Ubuntu Linux и Fedora Linux. Его нужно было установить в Manjaro Linux и Arch Linux с помощью следующей команды:

 sudo pacman -Syu tcpdump 

Мы можем запустить tcpdump в течение 10 секунд с параметрами по умолчанию и перенаправить его вывод в файл capture.txt с помощью следующей команды:

 timeout 10 sudo tcpdump> capture.txt 

capture.txt в окне терминала “width =” 646 “height =” 77 “onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); “onerror =” this.onerror = нуль; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (это); “/>

( tcpdump имеет свои собственные опции для сохранения захваченного сетевого трафика в файл. Это быстрый взлом, потому что мы обсуждаем timeout , а не tcpdump .)

tcpdump начинает захватывать сетевой трафик, и мы ждем 10 секунд. И 10 секунд приходят и уходят, и tcpdump все еще работает, а capture.txt продолжает увеличиваться в размере. Для остановки tcpdump потребуется поспешное нажатие клавиш Ctrl + C.

Проверка размера файла capture.txt с помощью ls показывает, что он вырос до 209 КБ за считанные секунды. Этот файл быстро рос!

 ls -lh capture.txt 

Что случилось?Почему timeout не остановил tcpdump ?

Это все связано с сигналами.

Отправка правильного сигнала

Когда timeout хочет остановить программу, он отправляет сигнал SIGTERM. Это вежливо просит программу завершиться. Некоторые программы могут игнорировать сигнал SIGTERM. Когда это происходит, нам нужно указать timeout быть немного более убедительным.

Мы можем сделать это, попросив timeout отправить сигнал SIGKILL.

Сигнал SIGKILL не может быть «пойман, заблокирован или проигнорирован» – он всегда проходит. SIGKILL не вежливо просит программу остановиться. SIGKILL прячется за углом с секундомером и кошкой.

Мы можем использовать опцию -s (сигнал), чтобы сообщить timeout об отправке сигнала SIGKILL.

 таймаут -s SIGKILL 10 sudo tcpdump> capture.txt 

capture.txt в окне терминала “width =” 646 “height =” 167 “onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); “onerror =” this.onerror = нуль; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (это); “/>

На этот раз по истечении 10 секунд tcpdump останавливается.

Сначала вежливо

Мы можем попросить timeout остановить программу, используя SIGTERM, и отправлять SIGKILL только в том случае, если SIGTERM не работает.

Для этого мы используем опцию -k (kill after). Опция -k требует значения времени в качестве параметра.

В этой команде мы просим timeout запустить dmesg в течение 30 секунд, а затем завершить его сигналом SIGTERM. Если dmesg все еще работает через 40 секунд, это означает, что дипломатический SIGTERM был проигнорирован, и timeout должен отправить SIGKILL для завершения задания.

dmesg – это утилита, которая может отслеживать сообщения кольцевого буфера ядра и отображать их в окне терминала.

 timeout -k 40 30 dmseg -w 

dmesg работает в течение 30 секунд и останавливается при получении сигнала SIGTERM.

Мы знаем, что не SIGKILL остановил dmesg , потому что SIGKILL всегда оставляет некролог из одного слова в окне терминала: «Killed». В этом случае этого не произошло.

Получение кода выхода из программы

Хорошо ведущие себя программы передают значение обратно в оболочку, когда они завершаются. Это известно как код выхода. Обычно это используется, чтобы сообщить оболочке – или какому-либо процессу, запустившему программу – были ли проблемы обнаружены программой во время ее работы.

timeout предоставляет собственный код выхода, но нас это может не волновать. Возможно, нас больше интересует код выхода из процесса, который контролирует timeout .

Эта команда позволяет ping работать в течение пяти секунд. Он пингует компьютер под названием Nostromo, который находится в тестовой сети, которая использовалась для исследования этой статьи.

 Тайм-аут 5 пинг Nostromo.local 

Команда выполняется в течение пяти секунд, и timeout завершает ее. Затем мы можем проверить код завершения с помощью этой команды:

 echo $? 

Код выхода – 124. Это значение timeout , используемое для указания того, что программа была прервана с использованием SIGTERM. Если SIGKILL завершает программу, код выхода – 137.

Если мы прервем программу с помощью Ctrl + C, код выхода из timeout будет равен нулю.

 Тайм-аут 5 пинг Nostromo.local 
 echo $? 

Если выполнение программы заканчивается до того, как timeout завершает его, timeout может передать код выхода из программы обратно в оболочку.

Чтобы это произошло, программа должна сама остановиться (другими словами, она не завершена timeout ), и мы должны использовать опция --preserve-status .

Если мы используем параметр -c (count) со значением пять, ping будет запускать только пять запросов. Если мы дадим timeout одну минуту, ping определенно прекратится сам по себе. Затем мы можем проверить значение выхода, используя echo .

 таймаут --preserve-status 1m ping -c 5 Nostromo.local 
 echo $? 

ping завершает пять запросов ping и завершает свою работу. Код выхода равен нулю.

Чтобы убедиться, что код выхода исходит из ping , давайте заставим ping сгенерировать другой код выхода. Если мы попытаемся отправить запросы ping на несуществующий IP-адрес, ping завершится с ошибкой с кодом завершения.Затем мы можем использовать echo , чтобы проверить, что код выхода не равен нулю.

 таймаут --preserve-status 1m ping -c 5 NotHere.local 
 echo $? 

Команда ping , очевидно, не может связаться с несуществующим устройством, поэтому она сообщает об ошибке и закрывается. Код выхода – два. Это код выхода, который ping использует для общих ошибок.

Установление Основных Правил

timeout – это ограничение границ работающих программ. Если существует опасность, что файлы журналов могут переполнить ваш жесткий диск или вы можете забыть, что оставили работающий сетевой инструмент, оберните их в timeout и позвольте вашему компьютеру саморегулироваться.

Оцените статью
TutoryBird.Ru
Добавить комментарий