leitura contínua do pipe nomeado (cat ou tail -f)

leitura contínua do pipe nomeado (cat ou tail -f)

Eu configurei rsyslogpara registrar determinados eventos de log em /dev/xconsole:

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

/dev/xconsoleé um pipe nomeado ( fifo). Se eu quiser ver o que está sendo registrado, posso fazer isso cat /dev/xconsole. Estou surpreso ao ver que o comando cat /dev/xconsolenão termina após a leitura do arquivo, mas atua como tail -f. em outras palavras, os dois comandos se comportam da mesma forma:

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

Alguém pode explicar por que isso acontece?

Existe alguma diferença entre os dois?

Responder1

catcontinua lendo até obter EOF. Um pipe produz EOF na saída somente quando obtém EOF na entrada. O daemon de registro está abrindo o arquivo, gravando nele,e mantê-lo aberto- assim como acontece com um arquivo normal - então o EOF nunca é gerado na saída. catapenas continua lendo, bloqueando sempre que esgota o que está atualmente no cano.

Você pode tentar fazer isso manualmente:

$ mkfifo test
$ cat test

E em outro terminal:

$ cat > test
hello

Haverá saída no outro terminal. Então digite:

world

Haverámaissaída no outro terminal. Se você agora usar Ctrl-D na entrada, a outra cattambém será encerrada.

Neste caso, a única diferença observável entre cate tail -fserá se o daemon de registro for encerrado ou reiniciado: catirá parar permanentemente quando a extremidade de gravação do canal for fechada, mas tail -fcontinuará (reabrindo o arquivo) quando o daemon for reiniciado.

Responder2

Há também uma diferençacarregandoentre cate tail -f. Você pode verificar isso:

Criar tubo:mkfifo pipe

Comece a ler o pipe usando catem segundo plano:cat pipe &

Abra o pipe e escreva nele a cada segundo:perl -MFcntl -we 'sysopen(my $fh, "pipe", O_WRONLY | O_NONBLOCK); while() {warn "written: " . syswrite($fh, "hello\n"); sleep 1}'

Agora tente isso com tail -f pipe &em vez de cat. Então você pode ver que catimprime linhas assim que elas são gravadas no pipe por script perl, enquanto tail -f as armazena em buffer até 4kb antes de imprimir no stdout.

Responder3

catmostra o arquivo inteiro quando tail -fmostra apenas as últimas linhas e as seguintes. Portanto, se o arquivo for curto, eles se comportarão da mesma forma, mas se o arquivo for grande (mais de 100 linhas), você poderá ver uma diferença clara entre os dois.

Informações adicionais sobre esses comandos:

tail http://www.computerhope.com/unix/utail.htm

cat http://www.computerhope.com/unix/ucat.htm

informação relacionada