Команда оболочки для отслеживания изменений в файле - как она вызывается снова?

160

Я знаю, что в Unix была команда, которую я мог бы использовать для мониторинга файла и просмотра изменений, которые в него записываются. Это было очень полезно, особенно для проверки файлов журнала.

Вы знаете, как это называется?

Себастьян Хойц
источник

Ответы:

214

Ты имеешь ввиду

tail -f logfile.log

?

( Man страница для хвоста )

Джон Скит
источник
6
Да, это в реальном времени.
Адам Гиббинс
18
Sidenote: Если ваш дистрибутив предоставляет команду tailf, используйте ее вместо tail -f. tailf более эффективен, потому что ему не нужен доступ к отслеживаемому файлу, если он не записывается (доступ к опросу раздражает, если вы смонтировали файловую систему с обновлением времени).
Михай Лимбашан,
10
В супер - пользователь , я нашел ответ рекомендуя хвост -F вместо -f тоже
Rafa
17
tail -Fбудет следовать именам файлов, а не объектам файла, что особенно полезно в случае ротации файла журнала.
Амир Али Акбари
2
Обновление, спустя несколько лет: tailfсейчас устарело и tail -fбезопасно. (подтвердите это в вашей системе с помощью man tailf.) См. документацию: man7.org/linux/man-pages/man1/tailf.1.html
exp1orer
124

Вы, вероятно, имели в виду хвост, согласно ответу Джона Скита.

Еще один полезный - часы ; это позволяет вам периодически запускать команду и видеть вывод на весь экран. Например:

смотреть -n 10 -d ls -l / var / adm / messages

Будет запускать команду ls -l /var/adm/messagesкаждые 10 секунд и выделять разницу в выходных данных между последующими запусками. (Полезно для просмотра, например, как быстро растет файл журнала).

Мурали Суриар
источник
38

inotifywaitиз inotify-tools полезен, если вы хотите запускать команду каждый раз, когда файл (или любые файлы в каталоге) изменяются. Например:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done
richvdh
источник
Просто примечание, pathкоторое не лучший выбор для имени переменной. На zsh, кажется , что окружающая среда вары не чувствительны к регистру. Для меня установка также pathприводит PATHк установке, и это в основном означает, что ничего не будет выполняться, пока вы не исправите это. Вкл bash, настройка pathне влияет на PATH.
Танатос
36

Я предпочитаю использовать less +FG1 над , tail -fпотому что я считаю себя необходимости искать файл журнала для конкретной ошибки или ID. Если мне нужно что-то искать, я печатаю, ^Cчтобы перестать следовать за файлом и ?начать поиск в обратном направлении.

Привязки клавиш почти такие же, как в vi. Любая команда может быть инициализирована при запуске с помощью +опции:

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.

Для очень длинных журналов я считаю удобным использовать -nопцию, которая отключает нумерацию строк. Из справочной страницы:

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).

1. Подсказка к rgmarcha за указание на это в комментариях.

Джон Эриксон
источник
Не забудьте установить aliasжелаемые параметры, чтобы вам не приходилось вводить их каждый раз.
Майкл Хэмптон
На самом деле, в большинстве случаев вы должны предпочитать функции оболочки, а не псевдонимы.
tripleee
21

Хвост велик ... меньше можно использовать, начните меньше с файла, т.е. меньше myfile, затем нажмите Shift+ F. Это меньше действует как хвост.

трент
источник
5
less + F myfile сделает это тоже
rgmarcha
16

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

#!/bin/bash
FILE="$1"
CMD="$2"
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

Сохрани это как watch.shи делай chmod u+x watch.sh. Затем я выполняю это следующим образом:

./watch.sh file.tex pdflatex

Если вы хотите, чтобы команда выполнялась только в случае фактического изменения, вы можете использовать `md5sum "$FILE"`вместо `ls -l "$FILE"`.

oliphaunt
источник
1
смотреть каталоги и их содержимое вместо одного файла:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Энди
8

вы можете использовать команду tailf, это очень просто

tailf logfile.log
Reegan Vijay
источник
6

Вы также можете использовать inotifywatch / inotifywait, который подключается к подсистеме inotify ядра. Таким образом, вы также можете наблюдать за такими вещами, как «открыть», «закрыть» или «доступ».

Но если вы просто хотите добавить дополнительные строки к stdout, я согласен с хвостом.

Мартин
источник
3

Хвост - это стандартный, традиционный, доступный везде инструмент unix. Немного более сложный инструмент - это мультитейл, который может контролировать несколько файлов одновременно и делает подсветку синтаксиса.

hlovdal
источник
3

Если я хочу иметь возможность искать вокруг файла в дополнение к простому отслеживанию, я использую меньше с командой «F».

При использовании tail, имейте в виду, что необходимы дополнительные аргументы, если файл может быть перевернут или заменен на edit (режим по умолчанию для vim: w).

tail -f заставит tail хранить файловый дескриптор и следовать ему. Если файл будет заменен, дескриптор будет изменен. Преимущество использования дескриптора файла заключается в том, что если файл переименован, вы все равно будете следовать за ним.

tail --follow = заставит tail отслеживать именованный файл, периодически открывая его, чтобы увидеть, был ли он заменен.

--retry - еще одна полезная опция, если вы хотите подключить файл журнала, но файл еще не создан.

tail -F - это сокращение для --follow = --retry.

deinspanjer
источник
2

Забудьте tailf, diff - это команда, которую вы хотите. Вот хороший трюк, чтобы увидеть различия, как они происходят в режиме реального времени (или близко) между 2 файлами или в одном файле, в который производится запись.

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

У вас есть 1 файл, и вы хотите посмотреть, как в него вносятся изменения:

Итак, что делать:

  1. скопировать файл

cp file file2

  1. написать скрипт bash, чтобы найти различия, и обновить file2

touch check-differences.sh

nano check-differences.sh

chmod 755 check-differences.sh

  1. Вот основная идея для сценария. Сделайте запись в файл, если хотите

#!/bin/bash

diff file file2

cp file file2

  1. Далее вы можете посмотреть различия на экране, используя часы

watch ./check-differences

это будет обновляться каждые 2 секунды по умолчанию. Поэтому, если вам нужно вернуться и прочитать их, запишите вывод diff в файл скрипта.

или используйте cron для регулярного запуска скрипта, если вам не нужно видеть вывод.

Mezmer
источник
1

Продолжая tail -f somefile.txtпрокручивать новые данные, я иногда предпочитаю less +G somefile.txtтакже посмотреть патч последних данных в файле.

phantomastray
источник
4
Я думаю, что все это отражено в этом ответе 7 лет назад.
kasperd