LinuxКак сделать

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

Linux ноутбук показывает приглашение bash
Фатмавати Ахмад Заенури / Shutterstock.com

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

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

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

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

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

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

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

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

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

  пинг 192.168.4.28 

пинг 192.168.4.28 в окне терминала

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

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

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

таймаут 15 пинг 192.168.4.28 в окне терминала

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

завершен сеанс пинга в окне терминала

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

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

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

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

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

таймаут 3 м пинг 192.168.4.28 в окне терминала

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

сеанс пинга в терминальной вдове

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

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

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

  sudo pacman -Сю tcpdump 

sudo pacman -Сю tcpdump в окне терминала

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

  таймаут 10 sudo tcpdump> 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 

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 

таймаут -s SIGKILL 10 sudo tcpdump> capture.txt в окне терминала

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

убит tcpdump в окне терминала

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

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

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

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

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

  время ожидания -k 40 30 dmseg -w 

timeout -k 40 30 dmseg -w в окне терминала

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

Вывод dmesg в окне терминала

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

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

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

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

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

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

таймаут 5 пинг Nostromo.local в окне терминала

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

  echo $? 

вывод ping и echo $? в окне терминала

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

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

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

Тайм-аут 5 пинг Nostromo.local в окне терминала с помощью Ctrl + C

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

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

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

  время ожидания --preserve-status 1m ping -c 5 Nostromo.local 
  echo $? 

время ожидания --preserve-status 1m ping -c 5 Nostromo.local в окне терминала

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

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

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

время ожидания --preserve-status 1m ping -c 5 NotHere.local в окне терминала

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

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

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

Похожие посты
Как сделать

Как получить возмещение за покупки в iTunes или App Store

Как сделать

Поверхностное перо не работает? Вот как это исправить

Как сделать

Как настроить и использовать Fire TV Recast

Как сделать

Как изменить рингтон по умолчанию на вашем iPhone