원격으로 작업을 시작할 수 있는 명령줄 인터페이스가 있는 CI 서버가 있습니다( jenkins
CI 서버 및 jenkins-cli.jar
도구).
작업을 시작한 후 tail -f
다음을 기록합니다(명령이 혼란스러워서 죄송합니다).
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\""
작업이 성공적으로 완료되면(보통 최소 5분) 출력에 다음 줄이 표시됩니다.
Finished: SUCCESS
이 시점에서 로그 테일링을 중지할 수 있는 좋은 방법이 있습니까? 비슷한 명령이 있습니까 tail_until 'some line' my-file.log
?
보너스:SUCCESS가 일치하면 0을 반환하고 FAILURE가 일치하면 1을 반환하는 답변을 제공할 수 있고 솔루션이 Mac에서 작동한다면! (나는 그것이 bsd 기반이라고 믿는다)
답변1
tail -f
에 파이프를 연결 sed
하여 검색 중인 줄을 발견하면 종료하도록 지시할 수 있습니다.
tail -f /path/to/file.log | sed '/^Finished: SUCCESS$/ q'
sed
기본적으로 처리하는 모든 줄을 인쇄하고 해당 줄을 보면 종료됩니다. tail
다음 줄을 쓰려고 시도하고 출력 파이프가 손상된 것을 발견하면 프로세스가 중지됩니다.
답변2
tail -f my-file.log | grep -qx "Finished: SUCCESS"
-q
, 조용함을 의미하며, 일치하는 항목이 발견되면 종료합니다.
-x
grep
전체 라인을 일치 시키세요 .
두 번째 부분에서는 다음을 시도하십시오.
tail -f my-file.log | grep -m 1 "^Finished: " | grep -q "SUCCESS$"
-m <number>
grep에게 다음 이후에 중지하라고 지시숫자성냥
grep -q
종료 상태가 줄 끝에서 발견된 경우에만 해당 됩니다.0
SUCCESS
모든 출력을 보고 싶다면 를 사용할 수 없지만 grep -q
이 작업을 수행할 수는 있습니다.
tail -f my-file.log | grep -m 1 "^Finished: "
존재 하는 경우 종료 상태를 1로 설정하는 것을 FAILURE
제외한 모든 작업을 수행합니다 .
답변3
나는 여기에 있는 답변이 마음에 들지 않아서 직접 시작하기로 결정했습니다. 이 bash 스크립트는 모든 기준을 충족하며 실패 시 1을 종료하는 보상을 포함합니다.
#!/bin/bash
while IFS= read -r LOGLINE || [[ -n "$LOGLINE" ]]; do
printf '%s\n' "$LOGLINE"
[[ "${LOGLINE}" == "Finished: SUCCESS" ]] && exit 0
[[ "${LOGLINE}" == "Finished: FAILURE" ]] && exit 1
done < <(timeout 300 tail -f my-file.log)
exit 3
또한 종료 코드 3이 발생하는 시간 초과 기능도 포함되어 있습니다. 시스템에 시간 초과 명령이 없으면 Anthony Thyssen으로부터 timeout.sh 스크립트를 가져옵니다.
https://antofthy.gitlab.io/software/("시간 초과:" 검색)
아래 설명을 바탕으로 이스케이프 문자 확장을 중지하고 표준 "읽기"의 모든 기능을 포함하도록 로그 인쇄를 업데이트했습니다. 바라보다https://stackoverflow.com/a/10929511완전한 "읽기" 세부 사항을 보려면. 여기서는 EOF 확인이 필요하지 않지만 완전성을 위해 포함되었습니다.
답변4
당신도 시도해 볼 수 있습니다
grep -q 'App Started' <(tail -f /var/log/app/app.log)