2011-12-27 11 views
15

Tengo un directorio lleno de archivos de registro continuos que me gustaría poder usar de manera simultánea.Tailing Rolling Files

Los archivos se denominan como tales:

name  modified 
00A.txt Dec 27 19:00 
00B.txt Dec 27 19:01 
00C.txt Dec 27 19:02 
00D.txt Dec 27 19:03 

En un sistema UNIX más viejo, que estoy tratando de llegar a un script de shell que se cola el archivo modificado más recientemente en un directorio específico, y si ese archivo se cierra administrativamente (pasa al siguiente archivo) Quiero que el programa comience automáticamente a seguir el nuevo archivo sin que tenga que salir de la cola para volver a ejecutarlo.

tail -100f `ls -t | head -1` 

El comportamiento deseado, teniendo en cuenta los nombres de los archivos anteriores, sería algo así:

./logtailer.sh 

A continuación, la secuencia de comandos comenzaría tizón 00D.txt. Tan pronto como el registrador terminó de escribir en 00D.txt y el archivo de registro más nuevo ahora se llamaba 00E.txt, el programa comenzaría automáticamente a rastrear ese archivo.

Se podría escribir esta secuencia de comandos al ver el resultado de la cola del texto "Archivo cerrado administrativamente" y luego ejecutar de nuevo el siguiente comando.

tail -100f `ls -t | head -1` 

¿Hay una forma más elegante de hacer esto que mirando el texto "archivo cerrado administrativamente"? ¿Cómo puedo leer la salida de la cola línea por línea en un script de shell?

Editar: Debo explicar que la bandera -F para la cola no es una opción para mí en este sistema. Utiliza una versión diferente de cola que no contiene esta característica. Versión del sistema operativo - Solaris 10

Respuesta

19

Puede utilizar la opción -F para tail que implica --follow=name --retry.

Desde la página man:

-F  
The -F option implies the -f option, but tail will also check to see if the 
file being followed has been renamed or rotated. The file is closed and 
reopened when tail detects that the filename being read from has a new inode 
number. The -F option is ignored if reading from standard input rather than 
a file. 
+0

me gustaría poder utilizar esta bandera, pero mi versión de cola no tiene esta característica y no tengo la opción de actualizar eso. (Sin derechos administrativos) – user1118047

+0

¿Puede proporcionar la 'versión info' de' tail' y 'box (unix/linux)' que está utilizando? –

+1

SunOS 5.10 No está seguro de cómo encontrar la versión de la cola ... – user1118047

3

es posible que tenga inotify para detectar la creación del nuevo archivo, una solución para que sería mantener el sondeo del sistema de archivos durante la ejecución de la cola en el fondo:

#!/bin/bash 

get_latest() { 
    local files=(*.log) 
    local latest=${files[${#files[@]}-1]} 
    echo "$latest" 
    [[ $latest == $1 ]] 
} 
run_tail() { 
    tail -c +0 -f "$1" 
} 

while true; do 
    while current=$(get_latest "$current"); do 
     sleep 1 
    done 
    [[ $pid ]] && kill $pid 
    run_tail "$current" & pid=$! 
done 

(no probado, innecesariamente hacky y tener cuidado con las limitaciones de su antiguo sistema!)

+1

Me gusta a dónde va esta respuesta ... No pude enchufar y usar esto directamente en un script de shell y hacer que haga lo que quiero, pero voy a jugar con el código aquí y ver qué puedo hacer para que funcione. – user1118047