계속하기 전에 프로세스가 파일 읽기를 시작했는지 어떻게 확인할 수 있나요?

계속하기 전에 프로세스가 파일 읽기를 시작했는지 어떻게 확인할 수 있나요?

데이터가 파일에 기록되는지 테스트하는 명령을 작성하려고 합니다. 나의 첫 번째 접근 방식은 다음과 같습니다.

  1. 백그라운드에서 읽기를 시작하세요.
  2. 일부 데이터를 파일에 씁니다.
  3. 독자들이 알아낼 때까지 기다리십시오.
  4. 무한히 반복하여 타이밍 문제가 있는지 확인합니다.

스크립트 형식:

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를 기반으로)을 실행했습니다.

관련 정보