В чем разница между «tail -f» и «tail -F»?

41

Я никогда не использовал tail -Fкоманду, вместо этого всегда использовал, tail -fоднако кто-то сказал мне, что -Fлучше без особых объяснений.

Я посмотрел справочную страницу для команды tail.

-f output appended data as the file grows;

-F Same as --follow=name --retry

--retry Keep trying to open a file even when it is or becomes inaccessible

Легко понять, что -fделает нижний , но я не понимаю, что -Fпытается сделать верхний регистр . Я был бы признателен, если бы кто-то смог объяснить мне различия.

DaeYoung
источник

Ответы:

74

Вы описываете tailутилиту GNU . Разница между этими двумя флагами заключается в том, что если я открою файл, например, файл журнала, например, так:

$ tail -f /var/log/messages

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

Если я открою файл с помощью tailэтого:

$ tail -F /var/log/messages

... и снова, файл поворачивается, вывод будет продолжать течь в моей консоли, потому tailчто он снова откроет файл, как только он снова станет доступным, то есть когда программы, записывающие в журнал, начнут записывать в новую /var/log/messages .

В свободных системах BSD нет никакой -Fопции, но она tail -fбудет вести себя как tail -Fв системах GNU, с той разницей, что вы получите сообщение

tail: file has been replaced, reopening.

в выводе, когда файл, который вы отслеживаете, исчезает и появляется снова.


ВЫ МОЖЕТЕ ПРОВЕРИТЬ ЭТО

В одном сеансе оболочки

$ cat >myfile

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

В другой сессии оболочки (может быть, в другом терминале, не прерываяcat ):

$ tail -f myfile

Это покажет (конец) содержимое myfileв консоли. Если вы вернетесь к первому сеансу оболочки и наберете что-то еще, этот вывод будет немедленно показан tailво втором сеансе оболочки.

Теперь выйдите cat, нажав Ctrl+Dи удалить в myfileфайл:

$ rm myfile

Затем снова запустите кошку:

$ cat >myfile

... и наберите что-нибудь, несколько строк.

В GNU tailэти строки не будут отображаться во втором сеансе оболочки (где tail -fвсе еще выполняется).

Повторите упражнение с tail -Fи наблюдайте разницу.

Кусалананда
источник
А ну понятно. У меня есть файл системного журнала, такой как foo.log, и иногда я вижу foo_06242016.log вместе с foo.log. Поэтому я запускаю tail -f foo.log, он будет указывать на foo_06242016.log?
DaeYoung
1
@DaeYoung Нет, не совсем. Если вы запустите tail -f foo.logи ваша система перейдет, foo.logнапример, foo.log.0.gzк выводу, который вы видите, он просто остановится. Если вы используете -Fс другой стороны, вы увидите содержимое нового foo.log без какого-либо перерыва между ними.
Кусалананда
4
+1 ... спасибо за то, что вы не ограничиваете свой ответ реализацией GNU, а также рассказываете людям о том, чего можно ожидать в другой среде.
TOOGAM
2
Очень хорошая иллюстрация с примером.
CVn
1
@Kusalananda: Спасибо за упражнение. Я заметил разницу, и это помогло мне лучше понять, что делают tail -f и tail -F. хорошего дня!
DaeYoung
14

Упрощенно, когда вы открываете файл, вы получите индекс, содержащий некоторые метаданные о том, где именно файл находится на вашем диске. Затем Хвост прислушается к изменениям в этом файле.

Если вы удалите файл и создадите новый файл с тем же именем, имя файла будет таким же, но это другой инод (и, вероятно, он будет храниться в другом месте на вашем диске). tail -fзаполнить, не повторять и загрузить новый инод, tail -Fобнаружит это.

Тот же эффект произойдет, если вы переименуете / переместите файл. Если вы, например, следует /var/log/messagesи logrotate поворачивает журнал в /var/log/messages.1. tail with по- -fпрежнему будет слушать старый индекс, который указывает на messages.1. Хвост с -Fэтим поймет и прочтет новый инод.

NSG
источник
Спасибо за ваше объяснение. Это имеет много смысла для меня сейчас.
DaeYoung
2
Все нормально. Я понимаю, что такой портной может быть легкой ошибкой. Мне особенно нравится тот факт, что ваша предыдущая орфографическая ошибка была исправлена ​​и подтверждена ... с другой орфографической ошибкой. :)
TOOGAM