С чего начать Первые шаги трек · 15 ступеней
Linux Labs

tail — последние строки и слежение за логом

4 мин Ubuntu 24.04 · GNU coreutils 9.4

Команда tail печатает конец файла и с ключом -f следит, как в журнал дописываются новые строки.

Шпаргалка

8 команд Версия для печати
  • tail app.log последние 10 строк
  • tail -n 50 app.log последние 50 строк
  • tail -n +2 data.csv всё, начиная со 2-й строки
  • tail -f /var/log/nginx/error.log следить; Ctrl+C — выход
  • tail -F app.log следить и пережить ротацию журнала
  • tail -n 0 -f app.log только новые строки, без старых
  • tail -f a.log b.log два файла сразу, с именами
  • tail -f app.log | grep --line-buffered ERROR следить за ошибками

Обзор

tail печатает конец файла: без ключей — 10 строк, с -n N — N строк. Новые записи журналов дописываются в конец, поэтому tail — первый взгляд на «что случилось только что».

Ключ -f (follow) не завершает команду: tail ждёт и печатает каждую строку, которую дописали в файл. Так смотрят журнал службы, пока воспроизводят ошибку в соседнем окне. Выход — Ctrl+C.

text
student@ubuntu:~$ tail -n 3 /var/log/dpkg.log
2026-10-18 09:12:41 status installed tree:amd64 2.1.1-2ubuntu3
2026-10-18 09:12:41 trigproc man-db:amd64 2.12.0-4build2 <none>
2026-10-18 09:12:42 status installed man-db:amd64 2.12.0-4build2

Журналы systemd лежат не в файлах, а в journald: для них аналог tail -f — journalctl -f (см. journalctl).

Ключи

6

-n 50 и короткая запись -50 равны. +N в -n +N значит «начиная со строки N». Полный список — man tail.

Ключ Что делает Пример
-n N Напечатать последние N строк; -n +N — начиная со строки N. tail -n 50 app.log
-f Не выходить и печатать строки, которые дописываются в файл. tail -f /var/log/nginx/error.log
-F Как -f, но следить по имени и заново открыть файл после ротации. tail -F app.log
-c N Напечатать последние N байт. tail -c 200 app.log
--pid PID С -f завершиться, когда процесс PID закончит работу. tail -f build.log --pid=4242
-q Не печатать заголовки ==> имя <== для нескольких файлов. tail -q -n 1 *.log

Ничего не найдено. Попробуй запрос короче.

Рецепты

4

Следить за журналом и видеть только ошибки

bash
tail -F /var/log/nginx/error.log | grep --line-buffered -i error

--line-buffered нужен, чтобы grep печатал совпадения сразу, а не пачками.

Пропустить строку заголовка

bash
tail -n +2 report.csv | sort -t, -k3 -n   # данные без заголовка

Последние строки нескольких журналов сразу

text
student@ubuntu:~$ tail -n 1 /var/log/dpkg.log /var/log/apt/history.log
==> /var/log/dpkg.log <==
2026-10-18 09:12:42 status installed man-db:amd64 2.12.0-4build2

==> /var/log/apt/history.log <==
End-Date: 2026-10-18  09:12:42

Остановить слежение вместе с процессом

bash
tail -f build.log --pid=$(pgrep -n make)   # выйдет вместе с make

Неполадки

5

tail -f замолчал после ротации журнала

logrotate переименовал файл и создал новый, а tail -f продолжает читать старый. Следи по имени: tail -F заново откроет файл, когда тот заменят.

tail: cannot open: Permission denied

Системные журналы читает root и группа adm. Используй sudo tail или проверь членство: id покажет, есть ли у тебя adm.

tail: cannot open 'x' for reading: No such file or directory

Файла нет — возможно, служба пишет в journald, а не в файл. Проверь ls /var/log/ и journalctl -u служба -n 50.

Новые строки появляются с задержкой

Программа буферизует свой вывод, а не tail. В конвейере после tail -f добавь --line-buffered для grep или stdbuf -oL перед командой.

Ctrl+C не возвращает приглашение

Щёлкни по терминалу, чтобы фокус был в нём, и нажми Ctrl+C ещё раз: без фокуса сочетание получает браузер.

См. также

  • head — начало файла.
  • less — листать и искать; F в less работает как tail -f.
  • journalctl — журналы systemd, journalctl -f.
  • logrotate — почему файлы журналов переименовываются.
  • grep — отобрать нужные строки из потока.
  • cat — файл целиком.
Загрузка…