.png)
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
및 사이에서 관찰할 수 있는 유일한 차이점은 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
. 따라서 cat
Perl 스크립트로 파이프에 작성하자마자 라인을 인쇄하는 동시에 tail -f
stdout으로 인쇄하기 전에 최대 4kb까지 버퍼링하는 것을 볼 수 있습니다 .
답변3
cat
tail -f
마지막 행만 표시하고 이어지는 경우 전체 파일을 표시합니다 . 따라서 파일이 짧으면 동일하게 동작하지만 파일이 크면(행 100개 이상) 두 파일 사이에 분명한 차이가 있음을 알 수 있습니다.
해당 명령에 대한 추가 정보: