从命名管道(cat 或 tail -f)连续读取

Mar*_*ter 20 pipe tail cat fifo

我已配置rsyslog将某些日志事件记录到/dev/xconsole

*.*;cron.!=info;mail.!=info      |/dev/xconsole
Run Code Online (Sandbox Code Playgroud)

/dev/xconsole是一个命名管道 ( fifo)。如果我想查看正在记录的内容,我可以做cat /dev/xconsole. 我很惊讶地看到,该命令cat /dev/xconsole在读取文件后并未完成,而是充当tail -f. 换句话说,这两个命令的行为相同:

cat /dev/xconsole
tail -f /dev/xconsole
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这是为什么吗?

两者之间有什么区别吗?

Mic*_*mer 23

cat继续阅读,直到获得 EOF。只有当管道在输入上获得 EOF 时,它才会在输出上产生 EOF。日志守护进程打开文件,写入文件,并保持打开状态——就像它对普通文件所做的那样——因此永远不会在输出中生成 EOF。cat只是继续阅读,每当它耗尽管道中当前的内容时就会阻塞。

您可以自己手动尝试:

$ mkfifo test
$ cat test
Run Code Online (Sandbox Code Playgroud)

而在另一个终端:

$ cat > test
hello
Run Code Online (Sandbox Code Playgroud)

另一个终端会有输出。然后:

world
Run Code Online (Sandbox Code Playgroud)

另一个终端会有更多的输出。如果您现在 Ctrl-D 输入,那么另一个cat也将终止。

在这种情况下,cat和之间唯一可观察到的区别tail -f是日志守护程序是否终止或重新启动:cat将在管道的写端关闭时永久停止,但tail -f在守护程序重新启动时将继续(重新打开文件)。

  • 然后你输入“world”,瞧,“world”出现在另一个终端中。 (2认同)