Яка різниця між «хвостом -f» та «хвостом -F»?


41

Я ніколи не використовував tail -Fкоманду, а завжди використовував, tail -fпроте хтось сказав мені, що -Fкраще без особливих пояснень.

Я переглянув сторінку людини для команди хвоста.

-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намагається зробити верхній регістр . Буду вдячний, що хтось може пояснити мені відмінності.

Відповіді:


75

Ви описуєте 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. Отже, я запускаю хвіст -f foo.log, він вказуватиме на foo_06242016.log?
DaeYoung

1
@DaeYoung Ні, не зовсім. Якщо ви запустите tail -f foo.logі ваша система переміститься, foo.logнаприклад, foo.log.0.gzвихід, який ви бачите, просто зупиниться. Якщо ви використовуєте -Fз іншого боку, ви побачите вміст нового foo.log без перерви між ними.
Kusalananda

4
+1 ... дякую за те, що ви не обмежили свою відповідь щодо впровадження GNU, але також повідомляєте людям, що можна очікувати в іншому середовищі.
TOOGAM

2
Дуже приємна ілюстрація з прикладом.
CVn

1
@Kusalananda: Дякую за вправу. Я помітив різницю, і це допомогло мені краще зрозуміти, що роблять хвіст -f і хвіст -F. майте благословенний день!
DaeYoung

14

Спрощено, коли ви відкриєте файл, ви отримаєте вклад, який містить деякі метадані про те, де саме файл знаходиться на вашому диску. Потім Tail прослухає зміни у цьому файлі.

Якщо ви видалите файл і створите новий з тим самим іменем, ім’я файлу буде однаковим, але це інший inode (і, ймовірно, зберігається в іншому місці вашого диска). tail -fзаповнити не повторювати і завантажити новий inode, tail -Fвиявить це.

Такий самий ефект відбудеться, якщо перейменувати / перемістити файл. Якщо ви, наприклад, /var/log/messagesслідуєте, і logrotate повертає журнал до /var/log/messages.1. Хвіст з -fще буде слухати старий inode, на який вказує messages.1. хвіст з -Fзрозуміє це і прочитає новий inode.


Дякуємо за ваше пояснення. Зараз для мене це має багато сенсу.
DaeYoung

2
Все добре. Я розумію, що такий хвіст може бути легкою помилкою. Мені особливо приємно, що ваша попередня орфографічна помилка була виправлена ​​та визнана ... з іншою орфографічною помилкою. :)
TOOGAM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.