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在守护程序重新启动时将继续(重新打开文件)。