Comando de Shell para monitorear los cambios en un archivo: ¿cómo se llama nuevamente?


160

Sé que había un comando en Unix que podría usar para monitorear un archivo y ver los cambios que se están escribiendo en él. Esto fue bastante útil especialmente para verificar archivos de registro.

¿Sabes cómo se llama?

Respuestas:


214

Quieres decir

tail -f logfile.log

?

( Página de manual para cola )


66
Si, es en tiempo real.
Adam Gibbins el

18
Nota al margen: si su distribución proporciona el comando tailf, úselo con preferencia a tail -f. tailf es más eficiente porque no necesita acceder al archivo observado si no se está escribiendo (los accesos de encuesta son molestos si
montaste

10
En súper usuario encontré una respuesta recomendando cola -F en lugar de -f también
Rafa

17
tail -Fseguirá los nombres de archivo en lugar de los objetos de archivo, lo cual es especialmente útil en caso de rotación del archivo de registro.
Amir Ali Akbari

2
Actualización, unos años más tarde: tailfahora está en desuso y tail -fes seguro. (confirme esto en su sistema con man tailf). Consulte la documentación: man7.org/linux/man-pages/man1/tailf.1.html
exp1orer

124

Probablemente quisiste decir cola, según la respuesta de Jon Skeet.

Otro útil es el reloj ; le permite ejecutar un comando periódicamente y ver la salida en pantalla completa. Por ejemplo:

watch -n 10 -d ls -l / var / adm / messages

Ejecutará el comando ls -l /var/adm/messagescada 10 segundos y resaltará la diferencia en la salida entre ejecuciones posteriores. (Útil para ver qué tan rápido crece un archivo de registro, por ejemplo).


38

inotifywaitfrom inotify-tools es útil si desea ejecutar un comando cada vez que cambia un archivo (o cualquier archivo en un directorio). Por ejemplo:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done

Solo una nota que pathno es la mejor opción para un nombre de variable. Sí zsh, parece que las variables de entorno no distinguen entre mayúsculas y minúsculas. Para mí, la configuración también pathhace PATHque se configure, y eso básicamente significa que nada se ejecutará hasta que lo arregles. Activado bash, la configuración pathno tiene efecto PATH.
Thanatos

36

Prefiero usar less +FG1 sobre tail -fporque necesito buscar en un archivo de registro un error o ID específico. Si necesito buscar algo, escribo ^Cpara dejar de seguir el archivo y ?comenzar a buscar hacia atrás.

Las combinaciones de teclas son más o menos las mismas que en vi. Cualquier comando se puede inicializar al inicio utilizando la +opción:

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.

Para registros realmente largos, me parece conveniente usar la -nopción que desactiva la numeración de líneas. Desde la página del manual:

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).

1. Hat-tip para rgmarcha por señalar esto en los comentarios.


Recuerde configurar un aliascon sus opciones deseadas, para que no tenga que escribirlas cada vez.
Michael Hampton

En realidad, generalmente debería preferir las funciones de shell sobre los alias en la mayoría de los casos.
tripleee

21

La cola es genial ... menos también se puede usar comenzar menos en el archivo, es decir, menos mi archivo y luego presionar Shift+ F. Esto tiene menos actuar como cola.


55
less + F myfile lo hará también
rgmarcha

16

Estoy editando un archivo LaTeX y quería monitorearlo también para detectar cambios en algún punto intermedio. Creé el siguiente pequeño script de shell que me resultó útil. Espero que también sea útil para alguien más.

#!/bin/bash
FILE="$1"
CMD="$2"
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

Guárdalo como watch.shy hazlo chmod u+x watch.sh. Luego lo ejecuto de la siguiente manera:

./watch.sh file.tex pdflatex

Si desea que el comando solo se ejecute si se produce una modificación real, puede usarlo en `md5sum "$FILE"`lugar de `ls -l "$FILE"`.


1
para ver directorios y sus contenidos en lugar de un solo archivo:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Andy


6

También puede usar inotifywatch / inotifywait que se enganchan en el subsistema inotify de núcleos. De esta manera, también puede observar cosas como "abrir", "cerrar" o "acceder".

Pero si simplemente desea obtener líneas adjuntas a stdout, estoy de acuerdo con la cola.


3

Tail es la herramienta estándar, tradicional, disponible en todas partes para Unix. Una herramienta un poco más sofisticada es el multitail, que puede monitorear varios archivos simultáneamente y resalta la sintaxis.


3

Si deseo poder buscar alrededor del archivo además de seguirlo, utilizo menos con el comando "F".

Cuando use tail, tenga en cuenta que se necesitan argumentos adicionales si el archivo se puede pasar o reemplazar por edición (modo predeterminado para vim's: w).

tail -f hará que tail almacene el descriptor de archivo y lo siga. Si se reemplaza el archivo, se cambiará el descriptor. El beneficio de seguir el descriptor de archivo es que si se cambia el nombre del archivo, aún lo seguirá.

tail --follow = hará que tail rastree el archivo nombrado volviéndolo a abrir periódicamente para ver si ha sido reemplazado.

--retry es otra opción útil si desea seguir un archivo de registro pero el archivo aún no se ha creado.

tail -F es un atajo para --follow = --retry.


2

Olvídate de tailf, diff es el comando que deseas. Aquí hay un buen truco para observar las diferencias a medida que ocurren en tiempo real (o cercano) entre 2 archivos o en un archivo en el que se está escribiendo.

Puede usar estos métodos para modificar el comportamiento de la forma que desee, como escribir los cambios en un archivo para mantener un registro. Juegue con el intervalo de observación u otras opciones para los comandos a continuación.

Tiene 1 archivo y desea ver cómo se realizan cambios en él:

Entonces aquí está lo que hay que hacer:

  1. copia el archivo

cp file file2

  1. escribir un script bash para encontrar las diferencias y actualizar file2

touch check-differences.sh

nano check-differences.sh

chmod 755 check-differences.sh

  1. Heres una idea básica para el guión. Haz que escriba en un archivo si quieres

#!/bin/bash

diff file file2

cp file file2

  1. A continuación, puede ver las diferencias en la pantalla usando watch

watch ./check-differences

esto se actualizará cada 2 segundos por defecto. Entonces, si necesita volver y leerlos, escriba la salida de diff en un archivo en el script.

o use cron para ejecutar su script regularmente si no necesita ver la salida.


1

Si bien se tail -f somefile.txtsigue desplazando con datos nuevos, a veces también prefiero less +G somefile.txtmirar un parche de datos más recientes en el archivo.


44
Creo que todo está cubierto en esta respuesta de hace 7 años.
kasperd el
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.