Come funziona il parametro "-f" del comando "tail"?


59
$ tail -f testfile

il comando dovrebbe mostrare le ultime voci nel file specificato, in tempo reale, giusto? Ma non sta succedendo. Per favore, correggimi, se quello che intendo fare è sbagliato ...

Ho creato un nuovo file "aaa", ho aggiunto una riga di testo e l'ho chiuso. quindi ha emesso questo comando (prima riga):

$ tail -f aaa
xxx
xxa
axx

le ultime tre righe sono i contenuti del file aaa. Ora che il comando è ancora in esecuzione (da quando l'ho usato -f), ho aperto il file aaa tramite la GUI e ho iniziato ad aggiungere alcune altre righe manualmente. Ma il terminale non mostra le nuove linee aggiunte nel file.

Cosa c'è che non va qui? Il tail -fcomando mostra solo nuove voci se sono scritte solo dal sistema? (come file di registro ecc.)

Risposte:


62

Dalla tail(1) pagina 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.

L'editor di testo sta rinominando o eliminando il file originale e salvando il nuovo file con lo stesso nome file. Usa -Finvece.


lavorato! Quindi, posso usare il $ tail -F filenamecomando tutto il tempo anziché $ tail -f filenamegiusto?
its_me

17
Se questo è il tuo comportamento previsto. Ci possono essere casi in cui si desidera seguire da descrittore anziché il nome del file, ma ad essere onesti non ho incontrato molti di quelli.
Ignacio Vazquez-Abrams,

lsofpuò mostrare che ciò sta accadendo, ad esempio lsof -Fpcftnidimostrerebbe che l'inode seguito da tailnon è più lo stesso che l'editor ha aperto.
Aaron D. Marasco il

10

Il tuo editor ha il suo buffer per il file. Quando modifichi il testo nell'editor, nulla viene scritto nel file stesso.

Quando salvi le modifiche, è probabile che l'editor elimini semplicemente il vecchio file e ne crei uno nuovo. tail -fsarà comunque collegato al file eliminato, quindi non mostrerà nulla di nuovo.


1
L'editor sovrascrive il file, i registri aggiungono il testo. Questo potrebbe essere il problema.
Rufo El Magufo,

@Juan: non capisco il tuo commento. "sovrascrivere" non ha alcun significato concreto tranne quello che ho descritto nella mia risposta.
Stéphane Gimenez,

Sì, intendevo lo stesso che tu :)
Rufo El Magufo,

3

tail "aggiorna" ogni 1 secondo per impostazione predefinita, non in tempo reale.

Prova con questo (hai bisogno di bash4):

  • Apri 2 terminali.
  • Nel primo terminale eseguire touch ~/output.txte tail -f ~/output.txt.
  • Nel secondo terminale eseguire for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • Guarda l'output di coda nel primo terminale.

Volevi dire echo $i >> ~/output.txt? Inoltre, questa risposta manca il punto della domanda.
Ignacio Vazquez-Abrams,

1
Sì, ho corretto l'errore mentre scrivevi il commento :). La mia risposta è solo un test per il problema Il comando tail -f mostra nuove voci solo se sono scritte solo dal sistema?
Rufo El Magufo,

4
@Juan: Al giorno d'oggi, su Linux, tailfha un'implementazione basata su inotify. Quindi si aggiornerà in tempo reale.
Stéphane Gimenez,

Sì per tailf, ma tailusa inotify ?. Non lo sapevo tailf. La manpage of tail mostra il valore predefinito di 1 secondo per -s.
Rufo El Magufo,

3
Sì, tailseguito e ora utilizza anche inotify quando disponibile. tailfnon esegue affatto il polling, ma solo dormendo, quando non c'è attività sul file. tail -fmostra alcune attività (vedi straceoutput).
Stéphane Gimenez,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.