명명된 파이프에서 지속적으로 읽기(cat 또는 tail -f)

명명된 파이프에서 지속적으로 읽기(cat 또는 tail -f)

rsyslog일부 로그 이벤트가 기록되도록 구성했습니다 /dev/xconsole.

*.*;cron.!=info;mail.!=info      |/dev/xconsole

/dev/xconsole명명된 파이프( fifo)입니다. 녹화되는 내용을 보고 싶다면 이렇게 하면 됩니다 cat /dev/xconsole. cat /dev/xconsole파일을 읽은 후 명령이 완료되지 않고 대신 tail -f. 즉, 두 명령이 동일하게 작동한다는 사실에 놀랐습니다 .

cat /dev/xconsole
tail -f /dev/xconsole

누군가 이것이 왜 설명할 수 있습니까?

둘 사이에 차이가 있나요?

답변1

catEOF에 도달할 때까지 계속 읽으세요. 파이프가 입력에서 EOF를 얻을 때만 출력에서 ​​EOF를 생성합니다. 로그 데몬이 파일을 열고 쓰고 있습니다.그리고 열어두세요— 일반 파일과 마찬가지로 — 출력에 EOF가 생성되지 않습니다. cat계속 읽으면서 파이프의 현재 콘텐츠가 소진될 때마다 차단하세요.

직접 수동으로 시도해 볼 수 있습니다.

$ mkfifo test
$ cat test

다른 터미널에서:

$ cat > test
hello

다른 터미널에 출력이 있을 것입니다. 그런 다음 다음을 입력하십시오.

world

있을 것이다다른 터미널로 출력합니다. 이제 Ctrl-D를 눌러 입력하면 다른 입력 cat도 종료됩니다.

cat이 경우 will과 will 사이에서 관찰할 수 있는 유일한 차이점은 tail -f로깅 데몬이 종료되는지 아니면 다시 시작되는지 여부입니다. cat파이프의 쓰기 측이 닫히면 영구적으로 중지되지만 tail -f데몬이 다시 시작되면 계속 실행됩니다(restart open) 파일).

답변2

또 다른 차이점은완충기사이. 다음을 살펴볼 cattail -f

파이프라인을 생성합니다.mkfifo pipe

백그라운드에서 파이프 읽기를 시작합니다 cat.cat pipe &

파이프를 열고 매초마다 다음을 작성하십시오.perl -MFcntl -we 'sysopen(my $fh, "pipe", O_WRONLY | O_NONBLOCK); while() {warn "written: " . syswrite($fh, "hello\n"); sleep 1}'

tail -f pipe &이제 대신 을 사용해 보십시오 . Perl 스크립트가 파이프에 라인을 쓰면 stdout으로 인쇄하기 전에 최대 4kb까지 버퍼링 하면서 인쇄하는 cat것을 볼 수 있습니다 .cattail -f

답변3

cattail -f마지막 줄과 다음 줄만 표시될 때 전체 파일을 표시합니다. 따라서 파일이 짧으면 동일하게 동작하지만 파일이 크면(100줄 이상) 둘 사이에 분명한 차이가 있음을 알 수 있습니다.

이러한 명령에 대한 추가 정보:

tail http://www.computerhope.com/unix/utail.htm

cat http://www.computerhope.com/unix/ucat.htm

관련 정보