GNU/Linux >> Znalost Linux >  >> Linux

Nepřetržité čtení z pojmenované dýmky (kočka nebo ocas -f)?

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.


Linux
  1. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  2. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  3. Jak přenosné jsou /dev/stdin, /dev/stdout a /dev/stderr?

  1. Kdy použít /dev/random vs /dev/urandom?

  2. Jak namapovat zařízení /dev/sdX a /dev/mapper/mpathY ze zařízení /dev/dm-Z

  3. Kdy mám použít /dev/shm/ a kdy /tmp/?

  1. DD z /dev/zero do /dev/null...co se vlastně stane

  2. RdRand z /dev/random

  3. čtení ze seriálu z příkazového řádku linuxu