Команда tail в Linux

Команда tail в Linux является важным инструментом командной строки. Команда используется в основном для вывода конца (текстового) файла или для ограничения вывода команды Linux. Таким образом, команда Linux tail находится в одном ряду с командой Linux head и командами «cat» и «less». Эти команды Linux используются для вывода содержимого текстовых файлов.

Команда Linux tail является частью GNU Core Utilities (Coreutils) — коллекции основных команд, содержащихся в операционной системе Linux с открытым исходным кодом. Coreutils публикуются под лицензией с открытым исходным кодом и доступны для загрузки для многих различных операционных систем.

Что представляет собой команда Linux tail?

Основной функцией команды tail в Linux является вывод конца файла. Как правило, новые данные, добавленные в файл, оказываются в его хвосте (т.е. в конце). Таким образом, команда Linux tail позволяет нам проверить, есть ли в файле новые данные. Поэтому команда Linux tail является популярным инструментом для оценки и мониторинга файлов журналов.

Многие программы, особенно веб-серверы, такие как Apache или nginx, записывают информацию о состоянии в так называемые файлы журналов. Например, каждая строка в файле журнала сервера содержит отметку времени, URL запрашиваемого ресурса и IP-адрес запрашивающей стороны.

Однако файлы журналов могут легко вырасти до огромных размеров с каждым запросом, который выполняется. Чтобы ограничить увеличение размеров файлов, файлы журналов обычно «вращаются». Файл журнала сжимается и архивируется под новым именем. Кроме того, создается новый, пустой файл журнала под первоначальным именем. Ниже приведен обзор распространенных файлов журналов в Ubuntu Linux:

Файл журнала Ubuntu Linux

Пояснение

/var/log/auth.log

Журнал авторизации Linux

/var/log/daemon.log

Журнал демона Linux

/var/log/debug

Журнал отладки Linux

/var/log/kern.log

Журнал ядра Linux

/var/log/syslog

Системный журнал Linux

/var/log/apache2/access.log

Доступ к веб-содержимому веб-сервера Apache2

/var/log/apache2/error.log

Сообщения об ошибках веб-серверов Apache2

Вызов команды Linux tail из командной строки

Вы можете вызвать команду Linux tail из командной строки. Как обычно, вводится имя команды, за которым следуют необязательные параметры. Завершает вызов имя или путь к одному или нескольким файлам. Давайте рассмотрим общий случай использования:

tail [options] <files>

Без опций простейший вызов команды Linux tail приводит к следующей схеме:

tail <file>

Выполненная таким образом, команда Linux tail печатает последние десять строк указанного файла. Это полезно, когда вы хотите просмотреть последние данные, записанные в файл.

Основные опции команды Linux tail

Командой tail в Linux можно управлять с помощью параметров. Как часть GNU Coreutils, каждый параметр имеет длинную форму, а более часто используемые параметры имеют короткую форму. Ниже приведен обзор наиболее полезных параметров опций:

Параметр (краткая форма/длинная форма)

Объяснение

-n / —lines

Ограничить вывод последними n строками / ограничить вывод строками, следующими за строкой n

-c / —bytes

Ограничить вывод последними n байтами / ограничить вывод байтами, следующими за байтом n

-q / -quiet, —silent

При использовании нескольких файлов подавить вывод имен файлов

-v / —verbose

Принудительный вывод имен файлов при использовании нескольких файлов

—help

Просмотр раздела справки для команды

—version

Просмотр информации о версии команды

Примечание

Команда Linux tail в основном предназначена для работы с текстовыми файлами в наборе символов ASCII, где один символ соответствует ровно одному байту. Но имейте в виду, что при обработке файлов в наборе символов Unicode с помощью опции «-c» команды Linux tail могут возникать непредвиденные ошибки.

Дополнительные опции команды Linux tail

Приведенные основные опции команды Linux tail функционально аналогичны опциям команды head. Однако, если команда head возвращает начало файла, то команда Linux tail выводит конец файла. Но эта команда способна на гораздо большее.

В частности, команда Linux tail предоставляет множество опций для отслеживания изменений в файлах. С помощью команды Linux tail данные, которые были добавлены в конец файла, могут выводиться непрерывно. Поэтому команда особенно подходит для мониторинга файлов журналов. Этот процесс также известен как «живой хвост». Ниже приведен обзор наиболее часто используемых опций:

Опция (короткая форма/длинная форма)

Объяснение

-f / —follow=[{имя|дескриптор}].

Отслеживать файл на предмет изменений и постоянно выводить новые данные, записанные в конец файла. Если значение не указано после «—follow=», по умолчанию используется «дескриптор». Это означает, что live tail продолжает выполняться, даже если файл переименован или перемещен.

-F

Соответствует вызову с параметром —follow= имя —retry; эффект заключается в том, что live tail продолжает выполняться, даже если исходный файл будет удален во время ротации журнала и заменен новым файлом с тем же именем.

-s / —sleep-interval=N

Вывод файла оставляется на отдых на указанное количество секунд.

—retry

Попытайтесь снова открыть недоступный файл, как только он снова станет доступным. Это особенно полезно в сочетании с опцией «—follow=name» для продолжения мониторинга нового файла с тем же именем после того, как файл журнала был повернут.

—pid=PID

Используется в сочетании с опцией -f, команда tail завершается, когда завершается процесс с указанным идентификатором процесса. Полезно для прерывания живого хвоста, когда завершается программа записи файлов.

Примеры использования команды tail в Linux

В документации Coreutils команда Linux tail перечислена в разделе «Вывод частей файлов». Следует знать, что термин «файлы» используется в широком смысле. Термин «текстовые потоки» является более точным.

Следуя философии Unix, команды командной строки используют текстовые потоки как универсальный формат ввода и вывода. Текстовые потоки в основном являются файлами, но включают в себя стандартный ввод и вывод командной строки. Кроме того, очень важны так называемые «трубы», поскольку они позволяют связать несколько команд. Выходные данные одной команды передаются в качестве входных данных для следующей команды.

Основная идея объединения нескольких команд в цепочку восходит к философии Unix. Вместо того чтобы разрабатывать сложные команды для совершенно разных задач, существует относительно управляемый набор общих команд. Следуя поговорке «делай одно дело, и делай его хорошо», каждая команда имеет узко определенную функциональность. Команды используют текстовые потоки в качестве универсального интерфейса и могут комбинироваться для многократного создания новых решений.

Примечание

В следующих примерах мы используем краткую форму («-n» вместо «-lines» и т.д.) при выполнении команды Linux tail. Вы часто будете сталкиваться с ними при чтении другой документации или примеров кода.

Общие примеры использования команды Linux tail

Следующие примеры основаны на базовых опциях команды Linux tail, показанных выше. Примеры расширенных опций приведены ниже в разделе о мониторинге файлов журналов.

В большинстве приведенных примеров команда Linux tail сочетается с одной или несколькими командами Linux. Упомянутые трубы используются для вывода команды в качестве входа для следующей команды.

Вывод конца файла с помощью команды Linux tail

В простейшем случае мы используем команду Linux tail для вывода последних строк файла. Чтобы попробовать это сделать, замените заполнитель «<file>» на имя или путь к существующему текстовому файлу в вашей системе. Здесь мы используем опцию -n и выводим последние три строки файла:

tail -n 3 <file>

Может быть полезно отслеживать контекст файла, обрабатываемого командой tail в Linux. Чтобы вывести строки с номерами строк, мы сначала обрабатываем файл командой nl (название происходит от «line numbering») и передаем вывод команде Linux tail:

nl <file> | tail -n 3

Вывод команды, использованной последней в командной строке

Команда history показывает команды, введенные в командную строку. Зачастую именно последние введенные команды являются тем, что нужно большинству людей. Кроме того, вывод истории команд может раскрыть конфиденциальные данные. В этом примере мы пересылаем вывод команды history команде Linux tail и выводим последние пять строк:

history | tail -n 5

Использование команды Linux tail для удаления самых старых файлов резервных копий в каталоге

Рассмотрим более сложный пример. Мы удалим десять самых старых файлов из каталога с резервными копиями. Для этого мы используем четыре команды Linux «ls», «tail», «xargs» и «rm»:

ls -t *.bak | tail | xargs rm

Что здесь происходит?

  1. Команда ls выводит список файлов в каталоге.

Используя опцию «-t», файлы сортируются по дате модификации. Самые старые файлы находятся внизу списка.

Мы используем шаблон поиска «* .bak» для источника данных. Это обычное расширение файлов для резервных копий. Оно также служит защитой, чтобы вы случайно не удалили важные файлы при открытии.

Мы передаем список файлов команде Linux tail.

  1. Используя команду Linux tail без указания опций, мы прочитаем последние десять файлов из списка. Имена выходных файлов — это самые старые файлы в каталоге.
  2. Команда xargs принимает список файлов и имя команды. Команда выполняется, когда файлы переданы в качестве аргументов.

В нашем примере команда Linux tail возвращает текст из нескольких строк. Каждая строка содержит имя удаляемого файла. Имена файлов отделяются от строк с помощью команды «xargs» и передаются в качестве аргументов команде rm.

  1. Для удаления файлов в Linux мы используем команду rm, которая удаляет файл, переданный в качестве аргументов.

Обратите внимание, что удаленные файлы не будут перемещены в корзину для мусора, а будут удалены немедленно.

Будьте осторожны при удалении файлов с помощью командной строки Linux. Чтобы опробовать приведенный ниже пример, лучше всего сначала создать каталог с тестовыми файлами. Для этого выполните следующий код в командной строке:

 

mkdir ~/Desktop/tail-test/
cd ~/Desktop/tail-test/
touch test-{1..100}.bak

Сначала мы создаем тестовый каталог «tail-test/» на рабочем столе и переходим в него. Затем создаем 100 пустых тестовых файлов с «test-1.bak» по «test-100.bak». Наконец, мы запускаем код для удаления десяти самых старых файлов:

ls -t ~/Desktop/tail-test/*.bak | tail | xargs rm

Использование команды Linux tail для мониторинга изменений в файлах журнала сервера

До сих пор мы рассматривали общую функциональность команды Linux tail. В следующих примерах мы сосредоточимся на мониторинге лог-файлов сервера в реальном времени («живой хвост»).

В этих примерах мы имеем в виду веб-сервер Apache2 под Ubuntu Linux, где файлы журналов размещаются в каталоге «/var/log/apache2/». В других дистрибутивах Linux место хранения может отличаться. То же самое относится и к другим веб-серверам, например, nginx.

Примечание

Возможно, что только пользователь root имеет доступ к директории с файлами журнала, в этом случае команды следует выполнять с правами «sudo».

Использование команды Linux tail для отслеживания изменений в файле журнала сервера

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

Рассмотрим, как это работает на примере журнала доступа веб-сервера Apache2. Мы вызываем команду Linux tail с опцией -f и передаем имя файла журнала:

tail -f /var/log/apache2/access.log

При таком выполнении изменения в журнале доступа выводятся непрерывно. Этот подход непрактичен, если в единицу времени происходит много обращений. В этом случае журнал меняется так быстро, что терминал переполняется данными. Нажмите комбинацию клавиш «Ctrl + C», чтобы отменить текущее выполнение live tail.

Команда tail в Linux отслеживает указанный файл после выполнения с опцией ‘-f’. Если она удалена, вывод данных отменяется. Как объяснялось в начале, файлы журналов периодически ротируются. Новый файл создается под предыдущим именем. Чтобы продолжить мониторинг файла журнала, несмотря на ротацию, мы используем опцию -F:

tail -F /var/log/apache2/access.log

Использование команды tail в Linux для отслеживания изменений в нескольких файлах журнала сервера

До сих пор мы обрабатывали один файл с помощью команды Linux tail. Однако команда позволяет одновременно отслеживать несколько файлов. Ниже мы используем шаблон поиска «* .log» для постоянного мониторинга всех файлов с расширением «.log»:

tail -F /var/log/apache2/*.log

Есть еще два варианта обработки нескольких файлов. С одной стороны, мы можем подавить вывод имен файлов с помощью опции «-q»:

tail -q -F /var/log/apache2/*.log

Аналогично, опция -v может быть использована для принудительного вывода имен файлов. Это имеет смысл, если шаблон поиска возвращает только один файл:

tail -v -F /var/log/apache2/*.log

Использование команды tail в Linux для мониторинга файла журнала сервера на предмет определенных изменений

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

 

tail -F /var/log/apache2/access.log | grep <example>

Имеет смысл отслеживать журнал сервера на предмет доступа по определенному IP-адресу. Это может быть полезно, например, для определения того, была ли атака на сервер уже завершена или еще продолжается. Здесь мы отслеживаем журнал доступа веб-сервера Apache на предмет запросов с IP-адреса «93 .184.216.34»:

tail -F /var/log/apache2/access.log | grep '93.184.216.34'
Примечание

Мы используем IP-адрес примера домена «example.com». Если журнал доступа действительно содержит это, то с большой вероятностью это поддельный IP-адрес.

Давайте рассмотрим еще один распространенный сценарий развертывания. Вместо того чтобы фильтровать журнал доступа по IP-адресу, мы отслеживаем доступ к определенному ресурсу. Доступ к файлу «robots.txt» указывает на запросы от ботов поисковых систем. И снова мы используем команду grep. Таким образом, отображаются только новые обращения от ботов поисковых систем:

tail -F /var/log/apache2/access.log | grep 'robots.txt'

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