2011-07-26 29 views
18

Necesito una solución para crear una secuencia de comandos para alinear un archivo de registro que se recrea (con el mismo nombre) después de que alcanza un determinado tamaño.¿Cómo puedo utilizar la cola para ver un archivo de registro que se recrea con frecuencia?

El uso de "tail -f" hace que la cola se detenga cuando se recrea/gira el archivo.

Lo que me gustaría hacer es crear un script que alinee el archivo y después de que llegue a 100 líneas, por ejemplo, reinicie el comando ... o incluso mejor para reiniciar el comando cuando se recrea el archivo? es algo como esto posible?

Gracias!

Respuesta

2

intente ejecutar

watch "tail -f" yourfile.log 
+0

El reloj no está disponible en el sistema Estoy ejecutando desafortunadamente – gfunk

15

Sí! Utilizar esto (el reintento hará que la cola de reintento cuando el archivo no existe o es de otro modo inaccesibles en lugar de sólo en su defecto - tales como archivos potencialmente cuando se están cambiando):

tail -f --retry <filename> 

O

tail --follow=name --retry 

O

tail -F <filename> 
+0

Esto parece que funcionaría bien, pero me sale un error. – gfunk

+0

~> tail -f --follow = name --retry /logs/logs/log.log cola: no se puede abrir la entrada – gfunk

+0

Parece que tiene '/ logs' allí dos veces. Es eso intencional? Si ese archivo no existe o no tiene permisos, recibirá un error. Sin embargo, con '--retry' seguirá intentándolo hasta que el archivo exista o tenga permisos para hacerlo. Pruébelo primero con un archivo de prueba en el directorio actual. – evan

0

Dado que usted no tiene una cola que es compatible con todas las características y porque usted no tiene reloj se puede utilizar un simple script que bucle indefinidamente para ejecutar la cola.

#!/bin/bash 

PID=`mktemp` 
while true; 
do 
    [ -e "$1" ] && IO=`stat -c %i "$1"` 
    [ -e "$1" ] && echo "restarting tail" && { tail -f "$1" 2> /dev/null & echo $! > $PID; } 

    # as long as the file exists and the inode number did not change 
    while [[ -e "$1" ]] && [[ $IO = `stat -c %i "$1"` ]] 
    do 
    sleep 0.5 
    done 
    [ ! -z $PID ] && kill `cat $PID` 2> /dev/null && echo > $PID 
    sleep 0.5 
done 2> /dev/null 
rm -rf $PID 

Es posible que desee utilizar trap para salir de forma limpia de este script. Esto depende de ti.

Básicamente, este script comprueba si el número de inodo (usando stat -c %i "$1") cambia para matar el comando tail y comienza uno nuevo cuando se recrea el archivo.

Nota: es posible que se deshaga del echo "restarting tail" que contaminará su salida. Solo fue útil para probar. También pueden surgir problemas si se reemplaza el archivo después de verificar el número de inodo y antes de comenzar el proceso de cola.

2

Si -F cola es no disponibles, y que está tratando de recuperarse de logrotate, puede añadir la opción copytruncate a su archivo de especificaciones logrotate.d/ así que en vez de crear un nuevo archivo cada vez que después de la rotación, el archivo se mantiene y se trunca, mientras se rota una copia.

De esta forma, el antiguo identificador de archivo continúa apuntando al nuevo archivo de registro (truncated) donde se anexan nuevos registros.

Tenga en cuenta que puede haber una cierta pérdida de datos durante este proceso copy-truncate.

Cuestiones relacionadas