名前付きパイプから継続的に読み取る(catまたはtail -f)

名前付きパイプから継続的に読み取る(catまたはtail -f)

rsyslogいくつかのログイベントが記録されるように設定しました/dev/xconsole

*.*;cron.!=info;mail.!=info      |/dev/xconsole

/dev/xconsole名前付きパイプ(fifo)。録画された内容を見たい場合は、これを行うことができますcat /dev/xconsolecat /dev/xconsoleファイルを読み取った後、コマンドは完了せずに代わりにtail -f。つまり、両方のコマンドが同じように動作するという事実に驚きました。

cat /dev/xconsole
tail -f /dev/xconsole

誰かがこれがなぜ説明できますか?

2つの間に違いはありますか?

ベストアンサー1

catEOFに達するまで読んでください。パイプが入力からEOFを取得した場合にのみ、出力からEOFを生成します。ログデーモンがファイルを開いて書き込んでいます。そして開いたままにしてください- 通常のファイルと同様 - 出力にEOFは生成されません。cat読み続けながら、パイプの現在のコンテンツがなくなるたびにブロックします。

手動で試してみることができます。

$ mkfifo test
$ cat test

他の端末から:

$ cat > test
hello

他の端末に出力があります。次に、次のように入力します。

world

ありますもっと他の端末に出力します。 Ctrl-Dを押して入力すると、他の入力catも終了します。

catこの場合、willとwillの間で観察できる唯一の違いは、tail -fロギングデーモンが終了するのか再起動されるのかということです。catパイプの書き込み側が閉じると永久に停止しますが、tail -fデーモンが再起動された後も実行されます(restart open)ファイル)。

おすすめ記事