Tengo un registro del servidor que genera una línea de texto específica en su archivo de registro cuando el servidor está activo. Quiero ejecutar un comando una vez que el servidor está activo y, por lo tanto, hacer algo como lo siguiente:
tail -f /path/to/serverLog | grep "server is up" ...(now, e.g., wget on server)?
¿Cuál es la mejor manera de hacer esto?
text-processing
shell-script
logs
tail
jonderry
fuente
fuente
tail -F
para manejar la rotación de registros, es decir,my.log
se llena y avanzamy.log.1
y su proceso crea un nuevomy.log
Respuestas:
Una manera simple sería awk.
Y sí, ambos son mensajes reales de un registro de kernel. Perl podría ser un poco más elegante de usar para esto y también puede reemplazar la necesidad de cola. Si usa perl, se verá más o menos así:
fuente
awk
solución por ser corto y fácil de hacer sobre la marcha en una línea. Sin embargo, si el comando que quiero ejecutar tiene comillas, esto puede ser un poco engorroso, ¿hay alguna alternativa, tal vez usando tuberías y comandos compuestos que también permitan una breve solución de una línea pero no requieran que se pase el comando resultante? como una cuerda?system()
comando.tail -f /path/to/serverLog | grep "server is up" | head -1 && do_some_command
tail -n 0 -f /path/to/serverLog
que leerá las últimas 0 líneas del archivo y luego esperará a que se impriman más líneas.Si solo está buscando una posibilidad y desea permanecer principalmente en el shell en lugar de usar
awk
operl
, puede hacer algo como:... que se ejecutará
my_command
cada vez que aparezca " servidor activo " en el archivo de registro. Para múltiples posibilidades, tal vez podría soltar elgrep
y en su lugar usar uncase
dentro delwhile
.La mayúscula
-F
le dicetail
que esté atento a la rotación del archivo de registro; es decir, si el archivo actual se renombra y otro archivo con el mismo nombre toma su lugar,tail
cambiará al nuevo archivo.La
--line-buffered
opción le dicegrep
que vacíe su búfer después de cada línea; de lo contrario,my_command
no se puede llegar a tiempo (suponiendo que los registros tengan líneas de tamaño razonable).fuente
--line-buffered
opcióngrep
o asegurarse de que vacíe su salida entre líneas: de lo contrario, simplemente se bloquea ymy_command
nunca se alcanza. Si lo prefieresack
, tiene una--flush
bandera; si lo prefiereag
, intente envolverlostdbuf
. stackoverflow.com/questions/28982518/…do exit ;
. Parecía funcionar bien, pero la cola nunca terminó y nuestro guión nunca pasó a la siguiente línea. ¿Hay alguna manera de detener la cola en lado
sección?Esta pregunta parece estar ya respondida, pero creo que hay una mejor solución.
En lugar de
tail | whatever
eso, creo que lo que realmente quieres esswatch
. Swatch es un programa diseñado explícitamente para hacer lo que está pidiendo, ver un archivo de registro y ejecutar acciones basadas en líneas de registro. El usotail|foo
requerirá que tengas un terminal activo para hacer esto. Swatch, por otro lado, funciona como un demonio y siempre estará vigilando tus registros. Swatch está disponible en todas las distribuciones de Linux,Te animo a que lo pruebes. Si bien puedes clavar un clavo con la parte posterior de un destornillador, no significa que debas hacerlo.
El mejor tutorial de 30 segundos sobre muestra que pude encontrar está aquí: http://www.campin.net/newlogcheck.html
fuente
Es extraño que nadie haya mencionado sobre la
multitail
utilidad que tiene esta funcionalidad lista para usar. Uno de ejemplo de uso:Vea también otros ejemplos de
multitail
uso.fuente
bash podría hacer el trabajo solo
Veamos cuán simple y legible podría ser:
Si bien no usas bash
regex
, ¡esto podría ser muy rápido!Pero bash + sed es un tándem muy eficiente e interesante
Pero para el servidor de alta carga, y como me gusta
sed
porque es muy rápido y muy escalable, a menudo uso esto:fuente
Así es como empecé a hacer esto también, pero me he vuelto mucho más sofisticado. Un par de cosas para preocuparse:
Yo uso algo en la línea de esto:
Funciona manteniendo
tail
abierto hasta que el${RELEASE}
archivo contenga datos.Una vez que lo
grep
tiene éxito:${RELEASE}
que${wait_pid}
proceso paratail
Nota:
sed
Puede ser más sofisticado determinar realmente el número de líneas quetail
se producirán al inicio y eliminar ese número. Pero en general, son 10.fuente