tail -f 그런 다음 일치하는 문자열에서 종료합니다.

tail -f 그런 다음 일치하는 문자열에서 종료합니다.

Tomcat을 시작하고 "서버 시작" 문자열에 대해 catalina.out을 모니터링한 다음 다른 프로세스를 실행하는 시작 스크립트를 구성하려고 합니다. 나는 grep 및 awk와 함께 tail -f의 다양한 조합을 시도했지만 아직 아무것도 작동하지 않았습니다. 내가 겪고 있는 주요 문제는 grep 또는 awk가 문자열과 일치한 후에 꼬리가 강제로 죽도록 하는 것 같습니다.

다음 테스트 사례로 단순화했습니다.

test.sh is listed below:

#!/bin/sh    
rm -f child.out
./child.sh > child.out &
tail -f child.out | grep -q B

child.sh is listed below:

#!/bin/sh
echo A
sleep 20
echo B
echo C
sleep 40
echo D

내가 보고 있는 동작은 grep이 20초 후에 종료되지만 꼬리가 죽는 데 40초가 더 걸린다는 것입니다. 나는 왜 이런 일이 일어나는지 이해합니다. tail은 데이터를 파일에 추가할 때만 발생하는 파이프에 쓸 때 파이프가 사라진 것을 알아차립니다. 이는 tail이 데이터를 버퍼링하고 B 및 C 문자를 단일 쓰기로 출력한다는 사실로 인해 더욱 복잡해집니다(나는 이것을 strace로 확인했습니다). unbuffer 명령을 사용하는 등 다른 곳에서 찾은 솔루션으로 이 문제를 해결하려고 시도했지만 도움이 되지 않았습니다.

내가 기대하는 대로 작동하게 하는 방법에 대한 아이디어를 가진 사람이 있나요? 또는 성공적인 Tomcat 시작을 기다리는 아이디어(TCP 포트가 시작되었음을 알 때까지 기다리는 것을 생각하지만 지금 하려는 작업보다 더 복잡해질 것이라고 생각함). 나는 경기에서 "killall tail"을 수행하여 awk로 작동하게 했지만 그 솔루션이 만족스럽지 않습니다. 참고 저는 이것을 RHEL4에서 작동시키려고 합니다.

답변1

이 같은?

mkfifo child.fifo
tail -f child.out > child.fifo &
pid=$!
grep -q B child.fifo && kill $pid

전부:

#!/bin/sh    
rm -f child.out
./child.sh > child.out &
mkfifo child.fifo
tail -f child.out > child.fifo &
pid=$!
grep -q B child.fifo && kill $pid
rm child.fifo

20초 안에 실행되는 것 같습니다.

$ time ./test2.sh

real    0m20.156s
user    0m0.033s
sys     0m0.058s

업데이트

이 방법도 작동하는 것 같습니다.

#!/bin/sh
rm -f child.out
./child.sh > child.out &
(tail -f child.out | grep -q B child.out)

가끔 즉시 종료되는 경우 sleep 1을 추가해 보세요. 즉,

#!/bin/sh
rm -f child.out
./child.sh > child.out &
sleep 1
(tail -f child.out | grep -q B child.out)

답변2

모두 한 줄에 'do foo'를 command'로 바꿉니다.

# 서비스 tomcat6 시작
# tail -f /var/log/tomcat6/catalina.out | awk '/서버 시작/{system("do foo"); 0번 출구'

답변3

꼬리를 잃습니다. 빈 child.out으로 시작하므로 필요하지 않으며 (찾은 대로) 문제가 복잡해집니다. 수면 루프의 첫 번째 인스턴스를 grep하면 됩니다.

until fgrep -q "Server startup" child.out; do sleep 1; done

항상 빈 catalina.out으로 시작하지 않기 때문에 꼬리를 유지해야 하는 경우 꼬리를 루프 내부에 배치합니다.

until tail child.out| fgrep -q "Server startup"; do sleep 1; done

관련 정보