Вы описываете 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
и наблюдайте разницу.
tail -f foo.log
и ваша система перейдет,foo.log
например,foo.log.0.gz
к выводу, который вы видите, он просто остановится. Если вы используете-F
с другой стороны, вы увидите содержимое новогоfoo.log
без какого-либо перерыва между ними.Упрощенно, когда вы открываете файл, вы получите индекс, содержащий некоторые метаданные о том, где именно файл находится на вашем диске. Затем Хвост прислушается к изменениям в этом файле.
Если вы удалите файл и создадите новый файл с тем же именем, имя файла будет таким же, но это другой инод (и, вероятно, он будет храниться в другом месте на вашем диске).
tail -f
заполнить, не повторять и загрузить новый инод,tail -F
обнаружит это.Тот же эффект произойдет, если вы переименуете / переместите файл. Если вы, например, следует
/var/log/messages
и logrotate поворачивает журнал в/var/log/messages.1
. tail with по--f
прежнему будет слушать старый индекс, который указывает наmessages.1
. Хвост с-F
этим поймет и прочтет новый инод.источник