it-swarm-ru.tech

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

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

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

167
Sebastian Hoitz

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

tail -f logfile.log

?

( Man-страница для tail )

220
Jon Skeet

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

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

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

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

128
Murali Suriar

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

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done
42
richvdh

Я предпочитаю использовать less +FG1 над tail -f потому что мне нужно искать в файле журнала конкретную ошибку или идентификатор. Если мне нужно что-то искать, я набираю ^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 для указания на это в комментариях.

37
Jon Ericson

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

21
trent

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

#!/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"`.

16
oliphaunt

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

tailf logfile.log
8
reegan vijay

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

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

6
Martin

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

3
hlovdal

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

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

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

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

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

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

3
deinspanjer

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

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

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

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

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

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

    touch check-differences.sh
    nano check-differences.sh
    chmod 755 check-differences.sh
    
  3. Вот основная идея для сценария. Сделайте запись в файл, если хотите

    #!/bin/bash
    diff file file2
    cp file file2
    
  4. Далее вы можете посмотреть различия на экране, используя часы

    watch ./check-differences
    

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

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

2
Mezmer

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

1
phantomastray