Команда оболочки для отслеживания изменений в файле - как она вызывается снова?
160
Я знаю, что в Unix была команда, которую я мог бы использовать для мониторинга файла и просмотра изменений, которые в него записываются. Это было очень полезно, особенно для проверки файлов журнала.
Sidenote: Если ваш дистрибутив предоставляет команду tailf, используйте ее вместо tail -f. tailf более эффективен, потому что ему не нужен доступ к отслеживаемому файлу, если он не записывается (доступ к опросу раздражает, если вы смонтировали файловую систему с обновлением времени).
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 секунд и выделять разницу в выходных данных между последующими запусками. (Полезно для просмотра, например, как быстро растет файл журнала).
Просто примечание, 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 за указание на это в комментариях.
Я редактирую файл 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"`.
Вы также можете использовать inotifywatch / inotifywait, который подключается к подсистеме inotify ядра. Таким образом, вы также можете наблюдать за такими вещами, как «открыть», «закрыть» или «доступ».
Но если вы просто хотите добавить дополнительные строки к stdout, я согласен с хвостом.
Хвост - это стандартный, традиционный, доступный везде инструмент unix. Немного более сложный инструмент - это мультитейл, который может контролировать несколько файлов одновременно и делает подсветку синтаксиса.
Если я хочу иметь возможность искать вокруг файла в дополнение к простому отслеживанию, я использую меньше с командой «F».
При использовании tail, имейте в виду, что необходимы дополнительные аргументы, если файл может быть перевернут или заменен на edit (режим по умолчанию для vim: w).
tail -f заставит tail хранить файловый дескриптор и следовать ему. Если файл будет заменен, дескриптор будет изменен. Преимущество использования дескриптора файла заключается в том, что если файл переименован, вы все равно будете следовать за ним.
tail --follow = заставит tail отслеживать именованный файл, периодически открывая его, чтобы увидеть, был ли он заменен.
--retry - еще одна полезная опция, если вы хотите подключить файл журнала, но файл еще не создан.
Забудьте tailf, diff - это команда, которую вы хотите. Вот хороший трюк, чтобы увидеть различия, как они происходят в режиме реального времени (или близко) между 2 файлами или в одном файле, в который производится запись.
Вы можете использовать эти методы, чтобы изменить поведение любым способом, таким как запись изменений в файл для ведения записи. Поиграйте с интервалом часов или другими параметрами для приведенных ниже команд.
У вас есть 1 файл, и вы хотите посмотреть, как в него вносятся изменения:
Итак, что делать:
скопировать файл
cp file file2
написать скрипт bash, чтобы найти различия, и обновить file2
touch check-differences.sh
nano check-differences.sh
chmod 755 check-differences.sh
Вот основная идея для сценария. Сделайте запись в файл, если хотите
#!/bin/bash
diff file file2
cp file file2
Далее вы можете посмотреть различия на экране, используя часы
watch ./check-differences
это будет обновляться каждые 2 секунды по умолчанию. Поэтому, если вам нужно вернуться и прочитать их, запишите вывод diff в файл скрипта.
или используйте cron для регулярного запуска скрипта, если вам не нужно видеть вывод.
tail -F
будет следовать именам файлов, а не объектам файла, что особенно полезно в случае ротации файла журнала.tailf
сейчас устарело иtail -f
безопасно. (подтвердите это в вашей системе с помощьюman tailf
.) См. документацию: man7.org/linux/man-pages/man1/tailf.1.htmlВы, вероятно, имели в виду хвост, согласно ответу Джона Скита.
Еще один полезный - часы ; это позволяет вам периодически запускать команду и видеть вывод на весь экран. Например:
Будет запускать команду
ls -l /var/adm/messages
каждые 10 секунд и выделять разницу в выходных данных между последующими запусками. (Полезно для просмотра, например, как быстро растет файл журнала).источник
inotifywait
из inotify-tools полезен, если вы хотите запускать команду каждый раз, когда файл (или любые файлы в каталоге) изменяются. Например:источник
path
которое не лучший выбор для имени переменной. Наzsh
, кажется , что окружающая среда вары не чувствительны к регистру. Для меня установка такжеpath
приводитPATH
к установке, и это в основном означает, что ничего не будет выполняться, пока вы не исправите это. Вклbash
, настройкаpath
не влияет наPATH
.Я предпочитаю использовать
less +FG
1 над ,tail -f
потому что я считаю себя необходимости искать файл журнала для конкретной ошибки или ID. Если мне нужно что-то искать, я печатаю,^C
чтобы перестать следовать за файлом и?
начать поиск в обратном направлении.Привязки клавиш почти такие же, как в
vi
. Любая команда может быть инициализирована при запуске с помощью+
опции:Для очень длинных журналов я считаю удобным использовать
-n
опцию, которая отключает нумерацию строк. Из справочной страницы:1. Подсказка к rgmarcha за указание на это в комментариях.
источник
alias
желаемые параметры, чтобы вам не приходилось вводить их каждый раз.Хвост велик ... меньше можно использовать, начните меньше с файла, т.е. меньше myfile, затем нажмите Shift+ F. Это меньше действует как хвост.
источник
Я редактирую файл LaTeX и хотел следить за ним и за изменениями где-то посередине. Я взялся за следующий небольшой сценарий оболочки, который оказался полезным для меня. Я надеюсь, что это также пригодится кому-то еще.
Сохрани это как
watch.sh
и делайchmod u+x watch.sh
. Затем я выполняю это следующим образом:./watch.sh file.tex pdflatex
Если вы хотите, чтобы команда выполнялась только в случае фактического изменения, вы можете использовать
`md5sum "$FILE"`
вместо`ls -l "$FILE"`
.источник
NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
вы можете использовать команду tailf, это очень просто
источник
Вы также можете использовать inotifywatch / inotifywait, который подключается к подсистеме inotify ядра. Таким образом, вы также можете наблюдать за такими вещами, как «открыть», «закрыть» или «доступ».
Но если вы просто хотите добавить дополнительные строки к stdout, я согласен с хвостом.
источник
Хвост - это стандартный, традиционный, доступный везде инструмент unix. Немного более сложный инструмент - это мультитейл, который может контролировать несколько файлов одновременно и делает подсветку синтаксиса.
источник
Если я хочу иметь возможность искать вокруг файла в дополнение к простому отслеживанию, я использую меньше с командой «F».
При использовании tail, имейте в виду, что необходимы дополнительные аргументы, если файл может быть перевернут или заменен на edit (режим по умолчанию для vim: w).
tail -f заставит tail хранить файловый дескриптор и следовать ему. Если файл будет заменен, дескриптор будет изменен. Преимущество использования дескриптора файла заключается в том, что если файл переименован, вы все равно будете следовать за ним.
tail --follow = заставит tail отслеживать именованный файл, периодически открывая его, чтобы увидеть, был ли он заменен.
--retry - еще одна полезная опция, если вы хотите подключить файл журнала, но файл еще не создан.
tail -F - это сокращение для --follow = --retry.
источник
Забудьте tailf, diff - это команда, которую вы хотите. Вот хороший трюк, чтобы увидеть различия, как они происходят в режиме реального времени (или близко) между 2 файлами или в одном файле, в который производится запись.
Вы можете использовать эти методы, чтобы изменить поведение любым способом, таким как запись изменений в файл для ведения записи. Поиграйте с интервалом часов или другими параметрами для приведенных ниже команд.
У вас есть 1 файл, и вы хотите посмотреть, как в него вносятся изменения:
Итак, что делать:
cp file file2
touch check-differences.sh
nano check-differences.sh
chmod 755 check-differences.sh
#!/bin/bash
diff file file2
cp file file2
watch ./check-differences
это будет обновляться каждые 2 секунды по умолчанию. Поэтому, если вам нужно вернуться и прочитать их, запишите вывод diff в файл скрипта.
или используйте cron для регулярного запуска скрипта, если вам не нужно видеть вывод.
источник
Продолжая
tail -f somefile.txt
прокручивать новые данные, я иногда предпочитаюless +G somefile.txt
также посмотреть патч последних данных в файле.источник