¿Cómo funciona el parámetro "-f" del comando "tail"?


59
$ tail -f testfile

se supone que el comando muestra las últimas entradas en el archivo especificado, en tiempo real, ¿verdad? Pero eso no está sucediendo. Por favor corrígeme, si lo que intento hacer está mal ...

Creé un nuevo archivo "aaa" y agregué una línea de texto y lo cerré. luego emitió este comando (primera línea):

$ tail -f aaa
xxx
xxa
axx

Las últimas tres líneas son los contenidos del archivo aaa. Ahora que el comando aún se está ejecutando (desde que lo usé -f), abrí el archivo aaa a través de la GUI y comencé a agregar algunas líneas más manualmente. Pero el terminal no muestra las nuevas líneas agregadas en el archivo.

¿Qué pasa aquí? ¿El tail -fcomando solo muestra nuevas entradas si están escritas solo por el sistema? (como archivos de registro, etc.)

Respuestas:


62

Desde la tail(1) página del manual :

   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.

Su editor de texto renombra o elimina el archivo original y guarda el nuevo archivo con el mismo nombre de archivo. Usar en su -Flugar.


¡trabajó! Entonces, puedo usar el $ tail -F filenamecomando todo el tiempo en lugar de $ tail -f filename¿verdad?
its_me

17
Si ese es tu comportamiento previsto. No puede haber casos en los que desea seguir por el descriptor en lugar de nombre de archivo, pero para ser justos no me he encontrado con muchos de esos.
Ignacio Vazquez-Abrams

lsofpuede mostrar que esto está sucediendo; por ejemplo lsof -Fpcftni, mostraría que el inodo seguido por tailya no es el mismo que el editor ha abierto.
Aaron D. Marasco

10

Su editor tiene su propio búfer para el archivo. Cuando modifica el texto en el editor, no se escribe nada en el archivo mismo.

Cuando guarda sus cambios, es probable que el editor simplemente elimine el archivo antiguo y cree uno nuevo. tail -fseguirá conectado al archivo eliminado, por lo que no mostrará nada nuevo.


1
El editor sobrescribe el archivo, los registros agregan el texto. Este quizás sea el problema.
Rufo El Magufo

@Juan: No entiendo tu comentario. "sobrescribir" no tiene un significado concreto, excepto el que describí en mi respuesta.
Stéphane Gimenez

Sí, quise decir lo mismo que tú :)
Rufo El Magufo

3

tail "Actualizar" cada 1 segundo por defecto, no en tiempo real.

Prueba con esto (necesitas bash4):

  • Abrir 2 terminales.
  • En el primer terminal ejecuta touch ~/output.txty tail -f ~/output.txt.
  • En la segunda terminal ejecute for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • Mira la salida de cola en la primera terminal.

Quiso decir echo $i >> ~/output.txt? Además, esta respuesta pierde el punto de la pregunta.
Ignacio Vazquez-Abrams

1
Sí, corrigí el error mientras escribías el comentario :). Mi respuesta es solo una prueba para el problema El comando tail -f solo muestra nuevas entradas si están escritas solo por el sistema.
Rufo El Magufo

44
@Juan: Hoy en día, en Linux, tailftiene una implementación basada en inotify. Por lo tanto, se actualizará en tiempo real.
Stéphane Gimenez

tailf, pero tailusa inotify ?. No sabía tailf. La página de manual de tail muestra el valor predeterminado de 1 segundo para -s.
Rufo El Magufo

3
Sí, tailseguido y ahora también está usando inotify cuando está disponible. tailfno está sondeando en absoluto, solo durmiendo, cuando no hay actividad en el archivo. tail -fmuestra alguna actividad (ver stracesalida).
Stéphane Gimenez
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.