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?

Sebastian Hoitz
fuente

Respuestas:

214

Quieres decir

tail -f logfile.log

?

( Página de manual para cola )

Jon Skeet
fuente
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).

Murali Suriar
fuente
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
richvdh
fuente
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.

Jon Ericson
fuente
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.

Trent
fuente
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"`.

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

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

tailf logfile.log
reegan vijay
fuente
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.

Martín
fuente
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.

hlovdal
fuente
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.

deinspanjer
fuente
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.

Mezmer
fuente
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.

Phantomastray
fuente
44
Creo que todo está cubierto en esta respuesta de hace 7 años.
kasperd el