Pipe
從命名管道連續讀取(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
有人可以解釋這是為什麼嗎?
兩者有什麼區別嗎?
cat
繼續閱讀,直到它得到EOF。只有當管道在輸入上獲得 EOF 時,管道才會在輸出上產生 EOF。日誌記錄守護程序正在打開文件、寫入文件並使其保持打開狀態——就像它對正常文件所做的那樣——因此永遠不會在輸出中生成 EOF。cat
只是繼續閱讀,每當它耗盡目前管道中的內容時就會阻塞。您可以自己手動嘗試:
$ mkfifo test $ cat test
在另一個終端:
$ cat > test hello
另一個終端會有輸出。然後輸入:
world
另一個終端會有更多的輸出。如果您現在 Ctrl-D 輸入,那麼另一個
cat
也將終止。
cat
在這種情況下,和will之間唯一可觀察到的區別tail -f
是日誌守護程序是否終止或重新啟動:cat
當管道的寫入端關閉時將永久停止,tail -f
但當守護程序重新啟動時將繼續(重新打開文件)。