company_banner

Кунг-фу стиля Linux: наблюдение за файлами

Original author: Al Williams
  • Translation
Linux или Unix приятно отличаются от многих других операционных систем тем, что Linux-программы часто выдают сообщения, которые записываются в какой-нибудь журнал. А многие команды даже можно настроить так, чтобы они генерировали бы больше сообщений, чем обычно. Я знаю о том, что в Windows есть средство для просмотра событий, но множество программ не особенно охотно делятся сведениями о своей работе. Это усложняет поиск источников проблем в тех случаях, когда что-то идёт не так, как ожидалось.



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

Как и во многих других случаях, в Unix-подобных системах есть инструменты для решения вышеописанной задачи. И, что неудивительно, таких инструментов существует довольно много. Если вы, например, пользовались командой tail, то вы уже видели один из таких инструментов. Но tail — это лишь вершина айсберга.

Давайте рассмотрим пример анализа файла, который можно назвать «матерью всех логов». Это — /var/log/syslog. Попробуйте вывести его на экран с помощью команды cat или less (я, в своих системах, всегда создаю псевдоним more для команды less, поэтому если я вдруг упомяну команду more — знайте, что я имею в виду less). Этот файл, вероятнее всего, будет очень большим, его размеры будут постоянно расти. В обычной настольной системе он ведёт себя довольно спокойно, но в некоторых старых системах и на серверах в нём можно увидеть последствия бурной деятельности разных программ. В любом случае, за исключением тех ситуаций, когда система только что загружена, в нём будут многие страницы данных.


Хакерский подход к анализу логов

Поиск информации, которая уже присутствует в этом файле, особых сложностей не вызывает. Тут можно воспользоваться grep, или можно загрузить копию файла в текстовый редактор. Проблема заключается в анализе свежей информации. Попробуйте подключить USB-устройство к системе (или отключите его от неё). Вы увидите, как в syslog появились новые записи. А что если в него постоянно добавляются десятки сообщений? Как за ними уследить?

И эта проблема характерна далеко не только для файла syslog. Например, интересно может быть наблюдать за файлом листинга в ходе выполнения долгой компиляции кода. То же относится и к наблюдению за перестроением RAID-массива. В общем-то, в Linux всегда можно найти некий большой файл, постоянно пополняемый свежими сведениями, за которым нужно понаблюдать.

Команда tail


Традиционный подход к наблюдению за файлами, постоянно пополняемыми информацией, заключается в использовании команды tail. Она берёт большой файл и возвращает лишь некоторое количество его последних строк. Эту команду можно вызвать с опцией -f. Тогда она будет ждать появления в файле новых данных и выводить их. Эта опция весьма полезна для наблюдения за файлами, в которые постоянно добавляется что-то новое. Опция -F приводит к практически такому же эффекту, но благодаря ей tail, если не может сразу открыть файл, будет продолжать пытаться открыть его. С помощью опции -m можно задавать количество выводимых последних строк файла, а с помощью опции -c — количество байтов. Опция -s позволяет задавать частоту проверки изменений файла.

Как по мне, так всё это выглядит очень даже хорошо. Попробуйте такую команду:

tail -f /var/log/syslog

Вы увидите несколько строк из конца файла системного журнала. А если подключить к компьютеру USB-устройство или отключить такое устройство от компьютера, можно увидеть, как сведения, попавшие в журнал, практически мгновенно выводятся на экране. Повторно запускать tail при этом не нужно.

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

Меньше — значит больше: полезные возможности команды less


У команды less есть опция +F, которая превращает эту команду в хорошую замену команды tail. На самом деле, если вы испытаете команду, приведённую ниже, вас может посетить мысль о том, что результаты её работы не очень-то и отличаются от результатов работы tail. Вот эта команда:

less +F /var/log/syslog

Вот как вывод этой команды выглядит на моём компьютере.


Результаты работы команды less

Обратите внимание на то, что в нижней части экрана имеется надпись Waiting for data…. В данный момент утилита less работает практически так же, как и tail. Но если нажать CTRL+C — произойдёт кое-что интересное. Ну — что-то, возможно, и произойдёт. Попробуйте. Если less переходит в командный режим — значит всё в порядке. Теперь можно заниматься всем тем, чем обычно занимаются, просматривая файлы с помощью less. Если же по нажатию CTRL+C работа less прекратится, это будет означать, что ваш Linux-дистрибутив «помог» вам, установив некоторые стандартные опции less с использованием переменной окружения LESS. Попробуйте такую команду:

set | grep LESS

Если вы увидите, что в списке опций имеется --quit-on-intr, это будет значить, что проблема заключается именно в данной строке. Её надо убрать. После этого переключиться в командный режим можно с использованием CTRL+C. Это, кроме того, означает, что вам нужно запомнить, что для выхода из less используется команда q. Если вы вышли из режима наблюдения за файлом и хотите снова в него вернуться — просто нажмите F.

Если вы пользуетесь less в обычном режиме (то есть — не использовали при запуске утилиты опцию +F), вы можете нажать клавишу F на клавиатуре для перехода в «tail-режим». А ещё интереснее то, что, нажав ESC-F можно в этом режиме что-то искать, при этом, если в поступающих данных найдётся совпадение с тем, что вас интересует, система вам об этом сообщит.

Команду less можно ещё использовать с ключом --follow-name. Это позволит добиться того же эффекта, что и использование опции -F команды tail.

Наблюдение за файлами с помощью команды watch


Иногда файл, за которым нужно наблюдать, не пополняется новыми данными, добавляемыми в его конец, а просто иногда меняется. Например, это файл /proc/loadavg или многие другие файлы из директории /proc. Использование команд tail или less не особенно хорошо подходит для наблюдения за такими файлами. Тут нам на помощь придёт команда watch:

watch -n 5 cat /proc/loadavg


Результат выполнения команды watch

Эта команда вызывает cat каждые 5 секунд и аккуратно выводит результат. Команда watch поддерживает множество полезных опций. Например, опция -d позволяет выделять отличия, а -p позволяет задействовать высокоточный таймер. Опция -c включает поддержку цвета.

Использование текстового редактора для наблюдения за файлами


Возможно, используемый вами текстовой редактор поддерживает tail-режим. При работе с emacs, например, есть несколько способов это организовать. Не буду рассказывать о том, как это сделать. Просто порекомендую вам эту отличную статью. Я не отношу себя к экспертам в области vim, но полагаю, что если вы пользуетесь этим редактором и хотите наблюдать за файлами, вам понадобится специальный плагин.

Если вы не ищете лёгких путей, то вам, возможно, подойдёт инструмент наподобие lnav, который сделан специально для просмотра логов. Просмотрщики журналов имеются, кроме того, в KDE и Gnome.

Итоги


Как это обычно бывает в Linux и Unix, у задачи организации наблюдения за файлами есть множество решений. Какое из этих решений «лучше» других? У каждого будет собственный ответ на этот вопрос. Именно это и делает Linux системой, привлекательной для продвинутых пользователей. Каждый из них может выбрать именно то, что подходит ему лучше всего.

Те команды, о которых мы говорили, могут пригодиться и тем, кто пользуется настольным дистрибутивом Linux, и тем, кто работает с серверами или с Raspberry Pi.

Как вы наблюдаете за постоянно изменяющимися файлами в Linux?



RUVDS.com
VDS/VPS-хостинг. Скидка 10% по коду HABR

Comments 7

    +8

    Это наблюдение за логами. По названию ожидал что то про inotify/auditd

      +1
      Кто знает где и как оболочка cinamon хранит свойства (цвет, иконка) у директорий? Я пытался использовать отслеживание изменений в файлах. Выяснил, что изменяются некоторые «экстра атрибуты» самих же директорий, которым назначаю цвет. Но при попытке копировать rsync-ом эти атрибуты не копируются. А их нужно сохранить.
      скриншот


      Вдруг кто знает? Спасибо!
        +1
        1. Убедитесь, что опция xattrs у rsync активирована.
        2. Убедитесь, что файловая система назначения поддерживает расширенные атрибуты.
        3. Попробуйте обновить rsync и компоненты системы (на случай, если есть баги).
          0
          Спасибо, чекнул все, но не помогло. Нагуглил в интернетах, что проблема эта давняя и пока не решенная. Возможно, я коряво перевел.
          What does work perfectly though, is setting extended attributes in the user namespace with setfattr and using rsync or cp to copy with them intact (there are even no issues with cp if you don't specify a value when creating the attribute). I think the bottom line is that using system namespace values is currently buggy and/or unsupported, at least in Debian and probably other distros too. Likely the rsync developers know this, which is why they ignore them.
        0
        я, в своих системах, всегда создаю псевдоним more для команды less

        А разве линукс позволяет использовать имя команды в виде алиаса для другой команды? В данном случае ок — less и more, в общем-то одно и то же, а если вместо more использовать другое служебное слово — top, mount и т.д.?
          0
          Да.
          #>which ls
          ls: aliased to ls --color=tty
          
          0
          Ни слова ни об auditd, ни о journalctl… короче, не кунг-фу, а так, драка первоклассников.

          Only users with full accounts can post comments. Log in, please.