it-swarm-es.com

Comando de Shell para monitorear cambios en un archivo

Sé que hubo 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?

167
Sebastian Hoitz

Quieres decir

tail -f logfile.log

?

( Página de manual para cola )

220
Jon Skeet

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

Otro útil es ver ; 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/messages cada 10 segundos, y resalte la diferencia en la salida entre ejecuciones posteriores. (Útil para ver qué tan rápido crece un archivo de registro, por ejemplo).

128
Murali Suriar

inotifywait from 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
42
richvdh

Prefiero usar less +FG1 terminado tail -f porque necesito buscar en un archivo de registro un error o ID específico. Si necesito buscar algo, escribo ^C para dejar de seguir el archivo y ? para 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 + 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 -n opció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 a rgmarcha por señalar esto en los comentarios.

37
Jon Ericson

Tail 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.

21
trent

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árdelo como watch.sh y hacer 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 usar `md5sum "$FILE"` en lugar de `ls -l "$FILE"`.

16
oliphaunt

puedes usar el comando tailf es el más fácil

tailf logfile.log
8
reegan vijay

También puede usar inotifywatch/inotifywait que se enganchan en el subsistema inotify de kernels. 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.

6
Martin

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

3
hlovdal

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. La ventaja 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.

3
deinspanjer

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. Juega un poco 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:

Así que aquí está lo que hay que hacer:

  1. copia el archivo

    cp file file2
    
  2. escribir un script bash para encontrar las diferencias y actualizar file2

    touch check-differences.sh
    nano check-differences.sh
    chmod 755 check-differences.sh
    
  3. Aquí hay una idea básica para el guión. Haz que escriba en un archivo si quieres

    #!/bin/bash
    diff file file2
    cp file file2
    
  4. 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.

2
Mezmer

Mientras tail -f somefile.txt sigue desplazándose con nuevos datos, I a veces prefiero less +G somefile.txt también para ver un parche de los últimos datos en el archivo.

1
phantomastray