Tengo un servidor CI con una interfaz de línea de comandos que me permite iniciar un trabajo de forma remota ( jenkins
servidor CI y la jenkins-cli.jar
herramienta).
Después de iniciar el trabajo, tail -f
el registro (perdón por el comando desordenado):
ssh -t my-jenkins-host.com "tail -f \"/var/lib/jenkins/jobs/$job_name/builds/\`ls -ltr /var/lib/jenkins/jobs/$job_name/builds/ | grep '^l' | tail -n 1|awk '{print \$9}'\`/log\""
Después de que el trabajo se completa con éxito, generalmente después de al menos 5 minutos, obtengo la siguiente línea en la salida:
Finished: SUCCESS
¿Hay una buena manera de dejar de seguir el registro en este momento? es decir, hay como un tail_until 'some line' my-file.log
comando?
BONIFICACIÓN: crédito adicional si puede proporcionar una respuesta que devuelva 0 cuando el ÉXITO coincida, 1 cuando la FALLA coincida, ¡y su solución funciona en mac! (que creo que está basado en bsd)
q
comando toma un código de salida opcional. Entonces elsed
comando seríased '/^Finished: SUCCESS$/ q0; /^Finished: FAILURE$/ q1'
Finished: SUCCESS
es la última línea de salida-q
, lo que significa tranquilo, se cierra tan pronto como encuentra una coincidencia-x
hacegrep
coincidir toda la líneaPara la segunda parte, intente
-m <number>
le dice a grep que pare después de que el número coinciday el
grep -q
estado de salida solo será0
siSUCCESS
se encuentra al final de la líneaSi desea ver toda la salida, no puede usar
grep -q
, pero aún puede hacerque hace todo excepto establecer el estado de salida en 1 si
FAILURE
aparece.fuente
grep
en mi respuesta en un principio, pero si él está usandotail -f
probablemente quiere ver la salida del archivo;grep
no va a mostrar todas las líneas intermediasUna variación en la respuesta de @ Mikel con los comentarios de @ Mrozek (habría respondido en el comentario pero creo que todavía no tengo suficientes privilegios)
le permitiría usar la solución de @ Mikel y aún ver el resultado en la pantalla
fuente
No me gustó ninguna de las respuestas aquí, así que decidí sacar la mía. Este script bash cumple con todos los criterios e incluye la BONIFICACIÓN para la salida de 1 en caso de falla.
También se incluye una función de tiempo de espera, que dará como resultado un código de salida de 3. Si no tiene el comando de tiempo de espera en su sistema, tome el script timeout.sh de Anthony Thyssen:
http://www.ict.griffith.edu.au/anthony/software/timeout.sh
Según los comentarios a continuación, actualicé la impresión del registro para detener la expansión de caracteres de escape e incluí todas las características de una 'lectura' estándar. Consulte /programming//a/10929511 para obtener detalles completos de 'lectura'. Aquí no se requiere la verificación EOF, pero se incluye para completar.
fuente
while IFS= read -r LOGLINE
para evitar que el shell realice una división de espacios en blanco en las líneastail
.read
no se divide cuando solo hay una variable (y no es una matriz con-a
), pero es necesario-r
si los datos de entrada contienen una barra invertida. Pero si los datos de entrada contienen una barra invertida, entoncesecho "$var"
también pueden estropearse dependiendo de su shell y / o sistema, así que mejorprintf '%s\n' "$line"
Aquí hay un script de Python que casi hace lo que quiero (ver las advertencias a continuación):
advertencias:
las líneas no se imprimen a medida que entran ... se imprimen en grupos ... parece que hay algo de almacenamiento en búfer
Tendría que instalar esto como una secuencia de comandos en mi ruta o algo así, por lo que es un inconveniente, y preferiría una línea pulida :)
fuente
tail
parece hacer el mismo almacenamiento en búfer, así que supongo que no es algo que valga la pena tratar de evitar.Tuve problemas con
sed
ygrep
sus opciones, así que escribo el míoone with bash conditions
fuente
También intentas
fuente