¿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.)

soy yo
fuente

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.

Ignacio Vazquez-Abrams
fuente
¡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.

Stéphane Gimenez
fuente
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.
Rufo El Magufo
fuente
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