Фатмавати Ахмад Заенури/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
и позвольте вашему компьютеру саморегулироваться.