데이터가 파일에 기록되는지 테스트하는 명령을 작성하려고 합니다. 나의 첫 번째 접근 방식은 다음과 같습니다.
- 백그라운드에서 읽기를 시작하세요.
- 일부 데이터를 파일에 씁니다.
- 독자들이 알아낼 때까지 기다리십시오.
- 무한히 반복하여 타이밍 문제가 있는지 확인합니다.
스크립트 형식:
while true
do
grep -q foo <(tail -n0 -f /var/log/syslog) &
logger foo && logger line && wait
done
(이 명령은 파일에 줄이 표시되는 것을 logger line
방지하기 위한 것입니다 )last message repeated N times
이 버전은 일반적으로 wait
명령 실행이 중단되기 전에 한두 번 반복 되므로 tail
파일에 쓰기 전에 읽기를 시작할 시간이 없는 것으로 보입니다.logger foo
가장 좋은 방법은 무엇입니까보장하다즉, tail
계속하기 전에 읽어보세요? 다음 해결 방법은 이상적이지 않습니다.
이전에 일시 중지
logger
(느린 파일 시스템의 경우 작동하지 않음)sleep 1 && logger foo && logger line && wait
두 번째 판독기를 시작하고 두 번째 판독기가 표시될 때까지 첫 번째 판독기가 읽기를 시작했다고 가정합니다. 막히기 전에 수천 번 반복했습니다.
grep -q foo <(tail -n0 -f /var/log/syslog) & grep -q bar <(tail -n0 -f /var/log/syslog) & while kill -0 $! do logger bar logger line done logger foo && logger line && wait
답변1
독자가 실제로 읽고 있는지 확인한 후 다시 사용하는 방법은 다음과 같습니다.
while true
do
exec 3<> myfifo
tail -n0 -f /var/log/syslog >&3 &
tailproc=$!
while ! grep -q start <&3
do
logger start
logger line
done
grep -q end <&3 &
logger end
logger line
wait $!
exec 3<&-
exec 3>&-
kill $tailproc
done
~부터작성자가 차단되어 아무도 읽을 수 없습니다.(첫 번째 grep
명령과 두 번째 명령 사이) 두 번째 명령은 grep
다음 줄을 놓칠 수 없습니다.
중단 없이 수만 번의 반복(출력의 프로세스 ID를 기반으로)을 실행했습니다.