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.