Pipe

從命名管道連續讀取(cat 或 tail -f)

  • November 16, 2021

我已配置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

有人可以解釋這是為什麼嗎?

兩者有什麼區別嗎?

cat繼續閱讀,直到它得到EOF。只有當管道在輸入上獲得 EOF 時,管道才會在輸出上產生 EOF。日誌記錄守護程序正在打開文件、寫入文件並使其保持打開狀態——就像它對正常文件所做的那樣——因此永遠不會在輸出中生成 EOF。cat只是繼續閱讀,每當它耗盡目前管道中的內容時就會阻塞。

您可以自己手動嘗試:

$ mkfifo test
$ cat test

在另一個終端:

$ cat > test
hello

另一個終端會有輸出。然後輸入:

world

另一個終端會有更多的輸出。如果您現在 Ctrl-D 輸入,那麼另一個cat也將終止。

cat在這種情況下,和will之間唯一可觀察到的區別tail -f是日誌守護程序是否終止或重新啟動:cat當管道的寫入端關閉時將永久停止,tail -f但當守護程序重新啟動時將繼續(重新打開文件)。

引用自:https://unix.stackexchange.com/questions/139490