Зачем нужна команда tail
в Linux? Она позволяет вывести на экран конец файла. Это необходимо для просмотра новых данных, например в содержимом лог-файла.
Содержание
Синтаксис
tail [ПАРАМЕТР]… [ФАЙЛ]…
Печать последних 10 строк каждого из ФАЙЛОВ на стандартный вывод. Если задано несколько ФАЙЛОВ, сначала печатается заголовок с именем файла. Если ФАЙЛ не задан или задан как -
, читает стандартный ввод.
Опции
- -c, --bytes=[+]N
- Показать последние N байт; или укажите
-c +N
, чтобы начать вывод каждого файла с N-го байта - -f, --follow[={name|descriptor}]
- Выводить поступающие данные по мере роста файла; при отсутствии параметра используется «descriptor»
- -F
- Эквивалент
--follow=name --retry
- -n, --lines=N
- Выводить последние N строк, а не последние 10; или используйте
-n +Н
для вывода, начиная с N-ной - --max-unchanged-stats=N
- С параметром
--follow=name
, повторно открывать ФАЙЛ, который не изменялся последние N (по умолчанию 5) итераций, чтобы проверить, не был ли он удалён или переименован (такое обычно бывает при ротации файлов системных журналов); при использовании механизма inotify этот параметр не требуется - --pid=PID
- С параметром
-f
, прерваться, когда процесс PID завершает работу - -q, --quiet, --silent
- Не выводить заголовки с именами файлов
- --retry
- Продолжать пытаться открыть файл даже когда он недоступен
- -s, --sleep-interval=С
- С параметром
-f
, бездействовать между повторениями примерно С секунд (по умолчанию 1.0); при использовании механизма inotify и --pid=P, проверять процесс P, по крайней мере, каждые С секунд - -v, --verbose
- Всегда выводить заголовки с именами файлов
- -z, --zero-terminated
- Разделитель строк NUL, а не символ новой строки
После K может стоять один из умножающий суффиксов: b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024 и так далее для T, P, E, Z, Y. Также можно использовать двоичные префиксы: KiB=K, MiB=M и так далее.
С параметром --follow
(-f
), tail по умолчанию следует за дескриптором файла, что означает, что даже если файл переименован, tail
будет и далее следить за его концом. Это поведение, принимаемое по умолчанию, нежелательно, если вы на самом деле хотите следить за именем файла, а не за дескриптором (например, при ротации файлов системных журналов). В таком случае используйте --follow=name
. Это заставит tail
следовать за указанным файлом, повторно открывая его периодически, чтобы узнать, не был ли он удален и заново создан какой-то другой программой.
Примеры использования в Linux команды tail
Вывод последних 10 строк файла
Команда запускается без опций:
oleg@mobile:~:$ tail /var/log/Xorg.0.log
[ 16034.180] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/0003:04D9:1203.0004/input/input16/event3"
[ 16034.180] (II) XINPUT: Adding extended input device "HID 04d9:1203" (type: KEYBOARD, id 12)
[ 16034.180] (**) Option "xkb_model" "pc105"
[ 16034.180] (**) Option "xkb_layout" "us,ru"
[ 16034.180] (**) Option "xkb_variant" " "
[ 16034.180] (**) Option "xkb_options" "grp:caps_toggle,grp_led:scroll,compose:ralt"
[ 16034.186] (II) event3 - HID 04d9:1203: is tagged by udev as: Keyboard
[ 16034.186] (II) event3 - HID 04d9:1203: device is a keyboard
[ 17059.525] (EE) event3 - HID 04d9:1203: client bug: event processing lagging behind by 35ms, your system is too slow
[ 17172.109] (EE) event3 - HID 04d9:1203: client bug: event processing lagging behind by 22ms, your system is too slow
Вывод последних N строк файла
Используется опция -n
:
oleg@mobile:~:$ tail -n 15 /var/log/Xorg.0.log
[ 16034.154] (**) HID 04d9:1203: always reports core events
[ 16034.154] (**) Option "Device" "/dev/input/event3"
[ 16034.156] (II) event3 - HID 04d9:1203: is tagged by udev as: Keyboard
[ 16034.156] (II) event3 - HID 04d9:1203: device is a keyboard
[ 16034.156] (II) event3 - HID 04d9:1203: device removed
[ 16034.180] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/0003:04D9:1203.0004/input/input16/event3"
[ 16034.180] (II) XINPUT: Adding extended input device "HID 04d9:1203" (type: KEYBOARD, id 12)
[ 16034.180] (**) Option "xkb_model" "pc105"
[ 16034.180] (**) Option "xkb_layout" "us,ru"
[ 16034.180] (**) Option "xkb_variant" " "
[ 16034.180] (**) Option "xkb_options" "grp:caps_toggle,grp_led:scroll,compose:ralt"
[ 16034.186] (II) event3 - HID 04d9:1203: is tagged by udev as: Keyboard
[ 16034.186] (II) event3 - HID 04d9:1203: device is a keyboard
[ 17059.525] (EE) event3 - HID 04d9:1203: client bug: event processing lagging behind by 35ms, your system is too slow
[ 17172.109] (EE) event3 - HID 04d9:1203: client bug: event processing lagging behind by 22ms, your system is too slow
Отслеживание появления новых строк
Используется опция -f
:
oleg@mobile:~:$ tail -f /var/log/Xorg.0.log
[ 16034.180] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/0003:04D9:1203.0004/input/input16/event3"
[ 16034.180] (II) XINPUT: Adding extended input device "HID 04d9:1203" (type: KEYBOARD, id 12)
[ 16034.180] (**) Option "xkb_model" "pc105"
[ 16034.180] (**) Option "xkb_layout" "us,ru"
[ 16034.180] (**) Option "xkb_variant" " "
[ 16034.180] (**) Option "xkb_options" "grp:caps_toggle,grp_led:scroll,compose:ralt"
[ 16034.186] (II) event3 - HID 04d9:1203: is tagged by udev as: Keyboard
[ 16034.186] (II) event3 - HID 04d9:1203: device is a keyboard
[ 17059.525] (EE) event3 - HID 04d9:1203: client bug: event processing lagging behind by 35ms, your system is too slow
[ 17172.109] (EE) event3 - HID 04d9:1203: client bug: event processing lagging behind by 22ms, your system is too slow
Отслеживание строк в нескольких файлах одновременно
Перечисляем необходимые файлы в параметрах:
oleg@mobile:~:$ tail /var/log/nginx/base-error.log /var/log/nginx/biotoilet-error.log
==> /var/log/nginx/base-error.log <==
2021/07/29 11:53:03 [error] 64214#64214: *52 FastCGI sent in stderr: "PHP message: PHP Fatal error: Array and string offset access syntax with curly braces is no longer supported in /home/http/base/inc/init.php on line 517" while reading response header from upstream, client: 127.0.0.1, server: base, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "base"
...
2021/07/28 14:01:03 [error] 41787#41787: *1 "/home/http/biotoilet/biotoilet/index.html" is not found (2: No such file or directory), client: 127.0.0.1, server: 127.0.0.1, request: "GET /biotoilet/ HTTP/1.1", host: "127.0.0.1"
2021/07/28 19:27:30 [error] 129763#129763: *18 open() "/home/http/biotoilet/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: biotoilet, request: "GET /favicon.ico HTTP/1.1", host: "biotoilet", referrer: "http://biotoilet/"
2021/07/29 16:55:08 [error] 268086#268086: *1 open() "/home/http/biotoilet/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: biotoilet, request: "GET /favicon.ico HTTP/1.1", host: "biotoilet", referrer: "http://biotoilet/"
Изменение частоты обновления файла
По умолчанию файл обновляется каждую секунду. Периодичность обновления позволяет изменить опция -s
:
oleg@mobile:~:$ tail -f -s 10 /var/log/nginx/access.log
127.0.0.1 - - [30/Nov/2021:14:02:54 +0200] "GET /favicon.ico HTTP/1.1" 404 187 "http://linuxcookbookru/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
127.0.0.1 - - [30/Nov/2021:14:03:31 +0200] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
127.0.0.1 - - [30/Nov/2021:14:03:31 +0200] "GET /favicon.ico HTTP/1.1" 404 187 "http://svastiru/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
127.0.0.1 - - [30/Nov/2021:14:03:43 +0200] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
127.0.0.1 - - [30/Nov/2021:14:03:44 +0200] "GET /favicon.ico HTTP/1.1" 404 187 "http://olegmensheninru/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
127.0.0.1 - - [30/Nov/2021:14:05:57 +0200] "GET /robots.txt HTTP/1.1" 404 187 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
127.0.0.1 - - [11/Dec/2021:14:35:25 +0200] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
127.0.0.1 - - [11/Dec/2021:14:35:25 +0200] "GET /favicon.ico HTTP/1.1" 404 187 "http://linuxcookbookru/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
127.0.0.1 - - [11/Dec/2021:14:35:37 +0200] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
127.0.0.1 - - [11/Dec/2021:14:35:37 +0200] "GET /favicon.ico HTTP/1.1" 404 187 "http://svastiru/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
Этот файл обновляется каждые 10 секунд.
Вывод N последних байт вместо N последних строк
Используется опция -c
:
oleg@mobile:~:$ tail -c 600 /var/log/nginx/access.log
36"
127.0.0.1 - - [11/Dec/2021:14:35:25 +0200] "GET /favicon.ico HTTP/1.1" 404 187 "http://linuxcookbookru/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
127.0.0.1 - - [11/Dec/2021:14:35:37 +0200] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
127.0.0.1 - - [11/Dec/2021:14:35:37 +0200] "GET /favicon.ico HTTP/1.1" 404 187 "http://svastiru/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
Вывод отфильтрованных строк
Добавляется команда grep
:
oleg@mobile:~:$ tail -f /var/log/nginx/error.log | grep error
2021/07/29 13:53:13 [error] 194009#194009: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "biotoilet", referrer: "http://biotoilet/"
Вывод отфильтрованных строк очень удобен для поиска ошибок при анализе логов сервера.
Итоги
Примеры использования в Linux команды tail
, приведённые в этой статье вы можете с успехом применять при анализе логов различных служб вашего сервера. Успехов вам!