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
cat
EOF에 도달할 때까지 계속 읽으세요. 파이프가 입력에서 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
또 다른 차이점은완충기사이. 다음을 살펴볼 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 &
이제 대신 을 사용해 보십시오 . Perl 스크립트가 파이프에 라인을 쓰면 stdout으로 인쇄하기 전에 최대 4kb까지 버퍼링 하면서 인쇄하는 cat
것을 볼 수 있습니다 .cat
tail -f
답변3
cat
tail -f
마지막 줄과 다음 줄만 표시될 때 전체 파일을 표시합니다. 따라서 파일이 짧으면 동일하게 동작하지만 파일이 크면(100줄 이상) 둘 사이에 분명한 차이가 있음을 알 수 있습니다.
이러한 명령에 대한 추가 정보: