Nakonfiguroval jsem rsyslog
k protokolování určitých událostí protokolu do /dev/xconsole
:
*.*;cron.!=info;mail.!=info |/dev/xconsole
/dev/xconsole
je pojmenovaný kanál (fifo
). Pokud chci vidět, co se protokoluje, mohu udělat cat /dev/xconsole
. Jsem překvapen, když vidím, že příkaz cat /dev/xconsole
nedokončí po přečtení souboru, ale místo toho funguje jako tail -f
. jinými slovy, oba příkazy se chovají stejně:
cat /dev/xconsole
tail -f /dev/xconsole
Může někdo prosím vysvětlit, proč tomu tak je?
Je mezi nimi nějaký rozdíl?
Přijatá odpověď:
cat
pokračuje ve čtení, dokud nedostane EOF. Roura produkuje EOF na výstupu pouze tehdy, když dostane EOF na vstupu. Logovací démon otevírá soubor, zapisuje do něj a nechává jej otevřený — stejně jako u běžného souboru — takže EOF se na výstupu nikdy negeneruje. cat
prostě pokračuje ve čtení a blokuje se, kdykoli vyčerpá to, co je aktuálně v potrubí.
Můžete si to sami vyzkoušet ručně:
$ mkfifo test
$ cat test
A v jiném terminálu:
$ cat > test
hello
Na druhém terminálu bude výstup. Potom:
world
Bude toho další výstup na druhém terminálu. Pokud nyní stisknete Ctrl-D na vstupu, pak na další cat
také skončí.
V tomto případě je jediný pozorovatelný rozdíl mezi cat
a tail -f
bude, pokud je protokolovací démon ukončen nebo restartován:cat
se trvale zastaví, když se zavře konec kanálu pro zápis, ale tail -f
bude pokračovat (znovu otevře soubor), když se démon restartuje.