Eu configurei rsyslog
para registrar certos 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, eu posso fazer cat /dev/xconsole
. Estou surpreso ao ver que o comando cat /dev/xconsole
não termina depois de ler o arquivo, mas age como tail -f
. em outras palavras, os dois comandos se comportam da mesma maneira:
cat /dev/xconsole
tail -f /dev/xconsole
Alguém pode explicar por que isso?
Existe alguma diferença entre os dois?
world
e, eis que "world" aparece no outro terminal.Há também uma diferença no buffer entre
cat
etail -f
. Você pode verificar isso:Criar canal:
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 em
tail -f pipe &
vez decat
. Assim, você pode ver quecat
imprime linhas assim que são gravadas no canal por script perl, enquanto astail -f
armazena em buffer até 4kb antes de imprimir em stdout.fonte
cat
mostra o arquivo inteiro quandotail -f
mostra apenas as últimas linhas e segue. 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 clara diferença entre os dois.Informações adicionais sobre esses comandos:
tail
http://www.computerhope.com/unix/utail.htmcat
http://www.computerhope.com/unix/ucat.htmfonte