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

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

Я никогда не использовал 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делает lower, но я не понимаю, что -Fпытается сделать upper case. Я был бы признателен, если бы кто-нибудь объяснил мне разницу.

решение1

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

$ 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и понаблюдайте за разницей.

решение2

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

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

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

Связанный контент