Я никогда не использовал 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 -f
fill не повторяйте попытку и загрузите новый inode, tail -F
это будет обнаружено.
Тот же эффект произойдет, если вы переименуете/переместите файл. Если вы, например, следуете /var/log/messages
и logrotate поворачивает журнал в /var/log/messages.1
. tail с -f
все еще будет слушать старый inode, который указывает на messages.1
. tail с -F
поймет это и прочитает новый inode.