Команда Shell для моніторингу змін у файлі - як це знову викликається?


159

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

Ви знаєте, як це називається?

Відповіді:


213

Ти маєш на увазі

tail -f logfile.log

?

( Сторінка людини для хвоста )


6
Так, це в реальному часі.
Адам Гіббінс

18
Sidenote: Якщо ваш дистрибутив забезпечує команду tailf, використовуйте цю перевагу перед хвостом -f. tailf є більш ефективним, оскільки йому не потрібно отримувати доступ до переглянутого файлу, якщо він не записується (доступ до опитувань дратує, якщо ви встановили файлову систему з оновленням atime.)
Mihai Limbăşan

10
У суперкористувача я знайшов відповідь, що рекомендує хвіст -F замість -f теж
Рафа

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

Просто примітка, яка pathне є найбільшим вибором для імені змінної. На zsh, здається , що навколишнє середовище вари не чутливі до регістру. Для мене встановлення також pathспричиняє PATHвстановлення, і це в основному означає, що нічого не буде виконано, поки ви не виправите це. Увімкнено bash, налаштування pathне впливає на PATH.
Танатос

36

Я вважаю за краще використовувати « less +FG1 over», 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 для вказівки на це в коментарях.


Не забудьте встановити aliasпотрібні параметри, тому вам не доведеться вводити їх кожен раз.
Майкл Хемптон

Насправді, у більшості випадків вам слід віддати перевагу функції оболонки над псевдонімами.
tripleee

21

Хвост чудовий ... менше можна також використовувати менший старт у файлі, тобто менше файлу, а потім натисніть Shift+ F. Це менше виступає як хвіст.


5
менше + F
мій файл

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"`.


1
переглядати каталоги та їх вміст замість одного файлу:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Енді


6

Ви також можете використовувати inotifywatch / inotifywait, який зачепить у ядра інотифікувати підсистему. Таким чином ви також можете спостерігати за такими речами, як "відкрити", "закрити" або "доступ".

Але якщо ви просто хочете отримати додані рядки до stdout, я згоден на хвіст.


3

Хвіст - це стандартний, традиційний, доступний скрізь unix інструмент. Трохи досконалішим інструментом є багатоповерхівка, яка може контролювати декілька файлів одночасно та робить підсвічування синтаксису.


3

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

Використовуючи хвіст, майте на увазі, що потрібні додаткові аргументи, якщо файл може перевертатися або замінюватися редагуванням (режим за замовчуванням для vim's: w).

хвіст -f призведе до того, що хвіст зберігає дескриптор файлу і дотримується його. Якщо файл буде замінено, дескриптор буде змінено. Перевага від слідування дескриптора файлу полягає в тому, що якщо файл буде перейменований, ви все одно будете слідувати за ним.

Хвіст --follow = зробить хвіст відслідковувати названий файл, періодично відкриваючи його, щоб побачити, чи він був замінений.

--retry - ще один корисний варіант, якщо ви хочете створити файл журналу, але файл ще не створений.

хвіст -F - це ярлик для - наступного = --повтори.


2

Забудьте "tailf", diff - команда, яку ви хочете. Ось хороший трюк, щоб спостерігати за різницями, як вони відбуваються в режимі реального часу (або закриття) між двома файлами або в одному файлі, який записується.

Ви можете використовувати ці методи для зміни поведінки будь-яким способом, наприклад, запису змін у файл для збереження запису. Пограйте з інтервалом перегляду чи іншими параметрами для команд нижче.

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

Тож ось що робити:

  1. скопіюйте файл

cp file file2

  1. написати сценарій bash, щоб знайти відмінності та оновити файл2

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 для регулярного запуску сценарію, якщо вам не потрібно бачити вихід.


1

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


4
Я думаю, що це все висвітлено у цій відповіді від 7 років тому.
kasperd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.