명명 된 파이프에서 연속 판독 (cat 또는 tail -f)


16

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

왜 그런지 설명해 주시겠습니까?

둘 사이에 어떤 차이가 있습니까?

답변:


18

catEOF를 얻을 때까지 계속 읽습니다. 파이프는 입력에서 EOF를 얻을 때만 출력에서 ​​EOF를 생성합니다. 로깅 데몬은 파일을 열고, 쓰고 , 일반 파일과 마찬가지로 열어 두 므로 EOF는 출력에서 ​​생성되지 않습니다. cat현재 파이프에있는 내용물이 모두 소모 될 때마다 차단하면서 계속 읽습니다.

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

$ mkfifo test
$ cat test

그리고 다른 터미널에서 :

$ cat > test
hello

다른 터미널에서 출력됩니다. 그때:

world

다른 터미널에 더 많은 출력 이있을 것 입니다. 이제 Ctrl-D를 입력하면 다른 입력 cat도 종료됩니다.

이 경우 로깅 데몬이 종료되거나 다시 시작되는 경우 cat와 관찰 tail -f할 수 있는 유일한 차이점 cat은 파이프의 쓰기 끝이 닫히면 영구적으로 중지되지만 tail -f데몬이 다시 시작되면 계속해서 파일을 다시 엽니 다.


"세계가": 당신의 예에서 오는 곳 미안 해요는 표시되지 않습니다
알렉산더 밀스

당신의 타이핑에서
마이클 호머

1
그런 다음을 입력 world하면 다른 터미널에 "world"가 나타납니다.
Michael Homer

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 &대신 대신 사용해보십시오 cat. 따라서 catperl 스크립트로 파이프에 쓰면 즉시 줄을 tail -f 인쇄하고 stdout으로 인쇄하기 전에 최대 4kb 를 버퍼링하는 것을 볼 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.