Хорошо, хватит компьютерного времени. Вы можете задать ограничения времени процессов, задав максимальное время, в течение которого они могут работать, с помощью команды timeout
. Вот руководство по установке ограничений на запуск программ с помощью этой команды.
Что делает для вас тайм-аут?
Команда timeout
позволяет вам установить ограничение продолжительности работы программы. Но почему вы хотите это сделать?
Один случай, когда вы точно знаете, как долго вы хотите запустить процесс. Распространенным вариантом использования является timeout
управления программой ведения журнала или сбора данных, чтобы файлы журнала не безжалостно поглощали пространство на жестком диске.
Другой случай, когда вы не знаете, как долго вы хотите запустить процесс, но знаете, что не хотите, чтобы он работал бесконечно. У вас может быть привычка запускать процессы, свернуть окно терминала и забыть о них.
Некоторые программы — даже простые утилиты — могут генерировать сетевой трафик на уровнях, которые могут снизить производительность вашей сети. Или они могут связать ресурсы на целевом устройстве, снижая его производительность. ( ping
, я смотрю на вас.) Не рекомендуется оставлять эти программы запущенными в течение длительного времени, пока вы не находитесь за компьютером.
timeout
является частью GNU Core Utils, поэтому в Linux и Unix-подобных операционных системах, таких как macOS, встроен тайм-аут. Ничего не нужно устанавливать; Вы можете использовать его прямо из коробки.
Начало работы с таймаутом
Вот простой пример. Например, с параметрами командной строки по умолчанию команда ping
будет выполняться до тех пор, пока вы не остановите ее, нажав Ctrl + C. Если вы не прервете это, оно просто продолжит.
пинг 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 -Сю tcpdump
Мы можем запустить tcpdump
течение 10 секунд с параметрами по умолчанию и перенаправить его вывод в файл capture.txt с помощью следующей команды:
таймаут 10 sudo tcpdump> capture.txt
(У tcpdump
есть свои опции для сохранения захваченного сетевого трафика в файл. Это быстрый взлом, потому что мы обсуждаем timeout
, а не tcpdump
.)
tcpdump
начинает захватывать сетевой трафик, и мы ждем 10 секунд. И 10 секунд приходят и уходят, tcpdump
все еще работает, а capture.txt продолжает увеличиваться в размере. Для остановки tcpdump
потребуется поспешное нажатие клавиш Ctrl + C.
Проверка размера файла capture.txt с помощью ls
показывает, что он вырос до 209K за считанные секунды. Этот файл быстро рос!
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
На этот раз, как только пройдет 10 секунд, tcpdump
остановится.
Сначала вежливо
Мы можем попросить timeout
чтобы попытаться остановить программу, используя SIGTERM, и отправлять SIGKILL только в том случае, если SIGTERM не работает.
Для этого мы используем опцию -k
(kill after). Опция -k
требует значения времени в качестве параметра.
В этой команде мы просим timeout
чтобы dmesg
работал в течение 30 секунд, а затем завершил его с помощью сигнала SIGTERM. Если dmesg
все еще работает через 40 секунд, это означает, что дипломатический SIGTERM был проигнорирован и timeout
должен отправить SIGKILL, чтобы завершить работу.
dmesg
— это утилита, которая может отслеживать сообщения кольцевого буфера ядра и отображать их в окне терминала.
время ожидания -k 40 30 dmseg -w
dmesg
работает в течение 30 секунд и останавливается при получении сигнала SIGTERM.
Мы знаем, что не SIGKILL остановил dmesg
потому что SIGKILL всегда оставляет некролог из одного слова в окне терминала: «Убит». В этом случае этого не произошло.
Получение кода выхода из программы
Хорошо ведущие себя программы передают значение обратно в оболочку, когда они завершаются. Это известно как код выхода. Обычно это используется, чтобы сообщить оболочке — или какому-либо процессу, запустившему программу — были ли проблемы обнаружены программой во время ее работы.
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
будет 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
и дайте компьютеру саморегулироваться.