텍스트가 보일 때까지 `tail -f`

텍스트가 보일 때까지 `tail -f`

원격으로 작업을 시작할 수 있는 명령줄 인터페이스가 있는 CI 서버가 있습니다( jenkinsCI 서버 및 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, 조용함을 의미하며, 일치하는 항목이 발견되면 종료합니다.

-xgrep전체 라인을 일치 시키세요 .

두 번째 부분에서는 다음을 시도하십시오.

tail -f my-file.log | grep -m 1 "^Finished: " | grep -q "SUCCESS$"

-m <number>grep에게 다음 이후에 중지하라고 지시숫자성냥

grep -q종료 상태가 줄 끝에서 발견된 경우에만 해당 됩니다.0SUCCESS

모든 출력을 보고 싶다면 를 사용할 수 없지만 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)

관련 정보