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.
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
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).
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.
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"`.
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.
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.
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.
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:
copia el archivo
cp file file2
escribir un script bash para encontrar las diferencias y actualizar file2
touch check-differences.sh
nano check-differences.sh
chmod 755 check-differences.sh
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
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.
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.
tail -F
seguirá 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.tailf
ahora está en desuso ytail -f
es seguro. (confirme esto en su sistema conman tailf
). Consulte la documentación: man7.org/linux/man-pages/man1/tailf.1.htmlProbablemente 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:
Ejecutará el comando
ls -l /var/adm/messages
cada 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).fuente
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:fuente
path
no 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énpath
hacePATH
que se configure, y eso básicamente significa que nada se ejecutará hasta que lo arregles. Activadobash
, la configuraciónpath
no tiene efectoPATH
.Prefiero usar
less +FG
1 sobretail -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?
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:Para registros realmente largos, me parece conveniente usar la
-n
opción que desactiva la numeración de líneas. Desde la página del manual:1. Hat-tip para rgmarcha por señalar esto en los comentarios.
fuente
alias
con sus opciones deseadas, para que no tenga que escribirlas cada vez.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.
fuente
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.
Guárdalo como
watch.sh
y hazlochmod 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"`
.fuente
NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
puedes usar el comando tailf es el más fácil
fuente
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.
fuente
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.
fuente
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.
fuente
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:
cp file file2
touch check-differences.sh
nano check-differences.sh
chmod 755 check-differences.sh
#!/bin/bash
diff file file2
cp file file2
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.
fuente
Si bien se
tail -f somefile.txt
sigue desplazando con datos nuevos, a veces también prefieroless +G somefile.txt
mirar un parche de datos más recientes en el archivo.fuente