Як працює параметр «-f» команди «хвіст»?


59
$ tail -f testfile

команда повинна відображати останні записи у вказаному файлі в режимі реального часу? Але цього не відбувається. Будь ласка, виправте мене, якщо те, що я маю намір це зробити, є неправильним ...

Я створив новий файл "aaa" і додав рядок тексту та закрив його. потім видав цю команду (перший рядок):

$ tail -f aaa
xxx
xxa
axx

останні три рядки - це вміст файлу aaa. Тепер, коли команда все ще працює (з моменту використання -f), я відкрив файл aaa через GUI і почав додавати ще кілька рядків вручну. Але термінал не відображає нові рядки, додані у файл.

Що тут не так? tail -fКоманда показує тільки нові записи , якщо вони написані тільки системи? (наприклад, файли журналу тощо)

Відповіді:


62

На tail(1) чоловіковій сторінці :

   With  --follow  (-f),  tail  defaults to following the file descriptor,
   which means that even if a tail’ed file is renamed, tail will  continue
   to  track  its  end.   This  default behavior is not desirable when you
   really want to track the actual name of the file, not the file descrip-
   tor (e.g., log rotation).  Use --follow=name in that case.  That causes
   tail to track the named file  in  a  way  that  accommodates  renaming,
   removal and creation.

Ваш текстовий редактор перейменовує або видаляє вихідний файл і зберігає новий файл під тим же ім'ям файлу. Використовуйте -Fзамість цього.


працювали! Отже, я можу використовувати $ tail -F filenameкоманду весь час замість $ tail -f filenameправа?
its_me

17
Якщо це ваша намічена поведінка. Там можуть бути випадки , коли ви хочете слідувати дескриптором замість імені файлу, але щоб бути справедливим , я не зустрічав багатьох з них.
Ігнасіо Васкес-Абрамс

lsofможе показати, що це відбувається - наприклад lsof -Fpcftni, показало б, що введення, за яким слідує, tailвже не є тим, яке відкрив редактор.
Аарон Д. Мараско

10

У вашого редактора є власний буфер для файлу. Коли ви змінюєте текст у редакторі, нічого не записується у сам файл.

Коли ви зберігаєте свої зміни, є ймовірність, що редактор просто видалить старий файл і створить новий. tail -fяк і раніше буде підключено до видаленого файлу, тому він не відображатиме нічого нового.


1
Редактор перезаписує файл, журнали додають текст. Це може бути проблема.
Руфо Ель Магуфо

@Juan: Я не розумію ваш коментар. "Перезапис" не має конкретного значення, крім того, який я описав у своїй відповіді.
Стефан Гіменез

Так, я мав на увазі те саме, що і ти :)
Руфо Ель Магуфо

3

tail "оновлювати" кожну 1 секунду за замовчуванням, а не в режимі реального часу.

Спробуйте з цим (вам потрібно bash4):

  • Відкрийте 2 клеми.
  • У першому терміналі виконують touch ~/output.txtі tail -f ~/output.txt.
  • У другому терміналі виконати for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • Подивіться на вихід хвоста в першому терміналі.

Ви мали на увазі echo $i >> ~/output.txt? Також ця відповідь пропускає суть питання.
Ігнасіо Васкес-Абрамс

1
Так, я виправив помилку, поки ви писали коментар :). Моя відповідь є лише тестом на проблему Команда -ff відображає нові записи, лише якщо вони написані лише системою?
Руфо Ель Магуфо

4
@Juan: На сьогодні Linux tailfмає реалізовану реалізацію. Так воно оновиться в режимі реального часу.
Стефан Гіменес

Так для tailf, але tailвикористовує inotify ?. Я не знав tailf. Сторінка хвоста показує за замовчуванням 1 секунду для -s.
Руфо Ель Магуфо

3
Так, tailслідує і зараз використовується ініціація, коли вона доступна. tailfвзагалі не опитується, просто спить, коли у файлі немає активності. tail -fпоказує деяку активність (див. straceвихід).
Стефан Гіменез
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.