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 -Fpara manejar la rotación de registros, es decir,my.logse llena y avanzamy.log.1y su proceso crea un nuevomy.logRespuestas:
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
awksolució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_commandtail -n 0 -f /path/to/serverLogque 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
awkoperl, puede hacer algo como:... que se ejecutará
my_commandcada vez que aparezca " servidor activo " en el archivo de registro. Para múltiples posibilidades, tal vez podría soltar elgrepy en su lugar usar uncasedentro delwhile.La mayúscula
-Fle dicetailque 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,tailcambiará al nuevo archivo.La
--line-bufferedopción le dicegrepque vacíe su búfer después de cada línea; de lo contrario,my_commandno se puede llegar a tiempo (suponiendo que los registros tengan líneas de tamaño razonable).fuente
--line-bufferedopcióngrepo asegurarse de que vacíe su salida entre líneas: de lo contrario, simplemente se bloquea ymy_commandnunca se alcanza. Si lo prefieresack, tiene una--flushbandera; 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 ladosección?Esta pregunta parece estar ya respondida, pero creo que hay una mejor solución.
En lugar de
tail | whatevereso, 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|foorequerirá 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
multitailutilidad que tiene esta funcionalidad lista para usar. Uno de ejemplo de uso:Vea también otros ejemplos de
multitailuso.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
sedporque 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
tailabierto hasta que el${RELEASE}archivo contenga datos.Una vez que lo
greptiene éxito:${RELEASE}que${wait_pid}proceso paratailNota:
sedPuede ser más sofisticado determinar realmente el número de líneas quetailse producirán al inicio y eliminar ese número. Pero en general, son 10.fuente