.png)
Eu configurei rsyslog
para 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/xconsole
nã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
cat
continua 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. cat
apenas 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 cat
também será encerrada.
Neste caso, a única diferença observável entre cat
e tail -f
será se o daemon de registro for encerrado ou reiniciado: cat
irá parar permanentemente quando a extremidade de gravação do canal for fechada, mas tail -f
continuará (reabrindo o arquivo) quando o daemon for reiniciado.
Responder2
Há também uma diferençacarregandoentre cat
e tail -f
. Você pode verificar isso:
Criar tubo:mkfifo pipe
Comece a ler o pipe usando cat
em 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 cat
imprime 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
cat
mostra o arquivo inteiro quando tail -f
mostra 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: