이전에 발견된 내용에 대해 걱정하지 않고 "tail -f | grep -q"를 트리거로 사용

이전에 발견된 내용에 대해 걱정하지 않고 "tail -f | grep -q"를 트리거로 사용

현재 Tomcat이 완전히 시작되었는지 확인하는 유일한 방법은 apache-tomcat 로그를 확인하는 것입니다.

tail -f ./catalina.out

그리고 내가 어떤 일을 하기 전에 이런 패턴이 나타나는지 찾아보세요.

org.apache.catalina.startup.Catalina.start Server startup in [0-9]* ms

나는 프로세스를 자동화하고 싶었고 작동하는 아래 스크립트를 작성했습니다.

tail -f ./catalina.out | egrep -q '*.Catalina.start Server startup in [0-9]* ms$' 
touch done

하지만 문제는 가끔 이전 실행을 읽고 즉시 완료한다는 것입니다.


예상 프로세스:

Tomcat이 중지됨 -> Tomcat이 다시 시작됨 -> tail shell이 ​​실행됨 -> Tomcat이 완전히 시작됨 -> Shell이 ​​완료되었다고 알려줌


내 스크립트가 수행할 수 있는 작업:

Tomcat이 중지됨 -> Tomcat이 다시 시작됨 -> tail shell이 ​​실행됨 -> 이전 로그로 인해 Tomcat이 완전히 시작되었다는 메시지가 즉시 표시되었습니다.

어떻게 이를 달성할 수 있나요?

답변1

기본적으로 tail -f후속 작업이 시작되기 전에 마지막 10줄을 읽습니다. -n해당 번호를 덮어 쓸 수 있으므로 tail -n0 -f 현재 끝에서 시작하고 이전 항목을 무시하고 새로운 변경 사항을 따릅니다.

다음을 실행하는 경우 참고하세요.

start tomcat in some way
tail -n0 -f logfile | grep -q

tailTomcat이 시작하라는 줄을 쓰기 전에 시작할 시간을 가질 만큼 충분히 느린 Tomcat에 의존하고 있습니다 . 일반적으로 그럴 수 있지만 스크립트는 tail실행되기 전에 임의로 긴 지연을 갖도록 예약될 수 있습니다. 따라서 실제로 어떻게든 tail먼저 시작하도록 준비해야 합니다.

다음과 같은 것을 상상할 수 있지만 확실하지는 않습니다.

tail -n0 -f logfile | grep -q &
pid=$!
start tomcat in some way
wait "$pid"

또한 일치하는 줄을 보면 종료되는 작은 문제가 있지만 grep -q이로 인해 종료되지는 않습니다 tail. 파이프가 닫힌 것을 확인 tail하고 파이프에 다시 쓰려고 할 때만 종료됩니다 (다음에 파일에 새 내용이 나타날 때).

물론, 파일이 지속적으로 새 항목으로 채워지면 이는 빠르게 발생합니다.

관련 정보