Nunca usé tail -F
el comando, sino que siempre lo usé, tail -f
sin embargo, alguien me dijo que -F
es mejor sin mucha explicación.
Busqué en la página de manual el comando tail.
-f output appended data as the file grows;
-F Same as --follow=name --retry
--retry Keep trying to open a file even when it is or becomes inaccessible
Es fácil entender lo que -f
hace la letra inferior, pero no entiendo lo que -F
intenta hacer la letra mayúscula. Agradecería que alguien pudiera explicarme las diferencias.
Respuesta1
Describes la tail
utilidad GNU. La diferencia entre estos dos indicadores es que si abro un archivo, por ejemplo un archivo de registro, como este:
$ tail -f /var/log/messages
... y si la función de rotación de registros de mi máquina decide rotar ese archivo de registro mientras veo los mensajes que se escriben en él ("rotar" significa eliminar o mover a otra ubicación, etc.), el resultado que veo será simplemente detener.
Si abro el archivo tail
así:
$ tail -F /var/log/messages
... y nuevamente, el archivo se gira, la salida continuaría fluyendo en mi consola porque tail
volvería a abrir el archivo tan pronto como volviera a estar disponible, es decir, cuando los programas que escribían en el registro comenzaron a escribir en elnuevo /var/log/messages
.
En los sistemas BSD libres no hay -F
opción, pero tail -f
se comportará como tail -F
en los sistemas GNU, con la diferencia de que aparece el mensaje
tail: file has been replaced, reopening.
en la salida cuando el archivo que estás monitoreando desaparece y reaparece.
PUEDES PROBAR ESTO
En una sesión de shell, haga
$ cat >myfile
Eso ahora esperará a que escribas cosas. Simplemente sigue adelante y escribe algunas tonterías, unas pocas líneas. Todo se guardará en el archivo myfile
.
Enotrosesión de shell (tal vez en otra terminal,sin interrumpir elcat
):
$ tail -f myfile
Esto mostrará el (final del) contenido de myfile
la consola. Si regresa a la primera sesión de Shell y escribe algo más, ese resultado se mostrará inmediatamente tail
en la segunda sesión de Shell.
Ahora salga cat
presionando Ctrl+Dyeliminarel myfile
archivo:
$ rm myfile
Luego vuelve a ejecutar al gato:
$ cat >myfile
... y escribe algo, unas pocas líneas.
Con GNU tail
, estas líneas seránnoaparecer en la segunda sesión de Shell (donde tail -f
todavía se está ejecutando).
Repita el ejercicio con tail -F
y observe la diferencia.
Respuesta2
Simplificado, cuando abre un archivo, obtendrá el inodo que contiene algunos metadatos de dónde se encuentra exactamente el archivo en su disco. Luego, Tail escuchará los cambios en ese archivo.
Si elimina el archivo y crea uno nuevo con el mismo nombre, el nombre del archivo será el mismo pero será un inodo diferente (y probablemente almacenado en un lugar diferente de su disco). tail -f
Complete, no vuelva a intentar y cargue el nuevo inodo, tail -F
detectará esto.
El mismo efecto ocurrirá si cambia el nombre o mueve un archivo. Si, por ejemplo, sigue /var/log/messages
y logrotate rota el registro a /var/log/messages.1
. tail with -f
seguirá escuchando el antiguo inodo que apunta a messages.1
. tail with -F
se dará cuenta de esto y leerá el nuevo inodo.