Jak działa parametr „-f” polecenia „tail”?


59
$ tail -f testfile

polecenie ma pokazywać najnowsze wpisy w określonym pliku, w czasie rzeczywistym, prawda? Ale tak się nie dzieje. Proszę mnie poprawić, jeśli to, co zamierzam zrobić, jest złe ...

Utworzyłem nowy plik „aaa”, dodałem wiersz tekstu i zamknąłem go. następnie wydał polecenie (pierwszy wiersz):

$ tail -f aaa
xxx
xxa
axx

ostatnie trzy wiersze to zawartość pliku aaa. Teraz, gdy polecenie wciąż działa (odkąd go użyłem -f), otworzyłem plik aaa przez GUI i zacząłem ręcznie dodawać kilka kolejnych wierszy. Ale terminal nie pokazuje nowych linii dodanych do pliku.

Co tu jest nie tak? tail -fKomenda pokazuje tylko nowe wpisy o ile są one napisane przez jedynego systemu? (jak pliki dziennika itp.)

Odpowiedzi:


62

Od tail(1) strony man :

   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.

Twój edytor tekstu zmienia nazwę lub usuwa oryginalny plik i zapisuje nowy plik pod tą samą nazwą pliku. Użyj -Fzamiast tego.


pracował! Więc mogę $ tail -F filenamecały czas używać polecenia, $ tail -f filenameprawda?
its_me

17
Jeśli takie jest twoje zamierzone zachowanie. Nie może być przypadki, gdzie chcesz iść przez deskryptor zamiast nazwy pliku, ale żeby być w porządku nie mam natknąć się wiele osób.
Ignacio Vazquez-Abrams

lsofmoże to pokazać - na przykład lsof -Fpcftnipokazałby, że i-węzeł, po którym tailnastępuje, nie jest już tym samym, który otworzył edytor.
Aaron D. Marasco,

10

Twój edytor ma własny bufor dla pliku. Po zmodyfikowaniu tekstu w edytorze nic nie jest zapisywane w samym pliku.

Po zapisaniu zmian istnieje prawdopodobieństwo, że edytor po prostu usunie stary plik i utworzy nowy. tail -fnadal będzie połączony z usuniętym plikiem, więc nie pokaże nic nowego.


1
Edytor nadpisuje plik, dzienniki dołączają tekst. To może być problem.
Rufo El Magufo

@Juan: Nie rozumiem twojego komentarza. „nadpisanie” nie ma żadnego konkretnego znaczenia poza tym, które opisałem w mojej odpowiedzi.
Stéphane Gimenez

Tak, miałem na myśli to samo, co ty :)
Rufo El Magufo

3

tail „odświeżanie” domyślnie co 1 sekundę, nie w czasie rzeczywistym.

Spróbuj tego (potrzebujesz bash4):

  • Otwórz 2 terminale.
  • W pierwszym terminalu uruchom touch ~/output.txti tail -f ~/output.txt.
  • W drugim terminalu wykonaj for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • Spójrz na wyjście ogona w pierwszym terminalu.

Miałeś na myśli echo $i >> ~/output.txt? Również ta odpowiedź nie ma sensu pytania.
Ignacio Vazquez-Abrams

1
Tak, poprawiłem błąd podczas pisania komentarza :). Moja odpowiedź jest tylko testem problemu. Polecenie tail -f pokazuje nowe wpisy tylko, jeśli są napisane tylko przez system?
Rufo El Magufo

4
@Juan: Obecnie na Linuksie tailfma implementację opartą na inotify. Więc odświeży się w czasie rzeczywistym.
Stéphane Gimenez

Tak tailf, ale tailużywa inotify ?. Nie wiedziałem tailf. Strona ogona pokazuje domyślnie 1 sekundę dla -s.
Rufo El Magufo

3
Tak, tailśledziłem i używa teraz inotify, jeśli jest dostępny. tailfwcale nie odpytuje, po prostu śpi, gdy w pliku nie ma żadnej aktywności. tail -fpokazuje pewną aktywność (patrz stracedane wyjściowe).
Stéphane Gimenez
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.