명명된 파이프에서 연속 읽기(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및 사이에서 관찰할 수 있는 유일한 차이점은 tail -f로깅 데몬이 종료되거나 다시 시작되는지 여부입니다. cat파이프의 쓰기 끝이 닫히면 영구적으로 중지되지만 tail -f데몬이 다시 시작되면 계속 진행(파일 다시 열기)됩니다.

답변2

에도 차이가 있습니다버퍼링cat와 ~ 사이에있는 tail -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까지 버퍼링하는 것을 볼 수 있습니다 .

답변3

cattail -f마지막 행만 표시하고 이어지는 경우 전체 파일을 표시합니다 . 따라서 파일이 짧으면 동일하게 동작하지만 파일이 크면(행 100개 이상) 두 파일 사이에 분명한 차이가 있음을 알 수 있습니다.

해당 명령에 대한 추가 정보:

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

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

관련 정보