lectura continua de la tubería con nombre (cat o tail -f)

16

He configurado rsyslogpara registrar ciertos eventos de registro en /dev/xconsole:

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

/dev/xconsolees una tubería con nombre ( fifo). Si quiero ver lo que se está registrando, puedo hacerlo cat /dev/xconsole. Me sorprende ver que el comando cat /dev/xconsoleno termina después de leer el archivo, sino que actúa como tail -f. en otras palabras, los dos comandos se comportan igual:

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

¿Alguien puede explicar por qué es eso?

¿Hay alguna diferencia entre los dos?

Martin Vegter
fuente

Respuestas:

18

catsigue leyendo hasta que se pone EOF. Una tubería produce EOF en la salida solo cuando obtiene EOF en la entrada. El daemon de registro está abriendo el archivo, escribiendo en él y manteniéndolo abierto , tal como lo hace para un archivo normal, por lo que EOF nunca se genera en la salida. catsolo sigue leyendo, bloqueándose cada vez que agota lo que hay actualmente en la tubería.

Puede probar esto usted mismo manualmente:

$ mkfifo test
$ cat test

Y en otra terminal:

$ cat > test
hello

Habrá salida en la otra terminal. Luego:

world

Habrá más salida en la otra terminal. Si ahora haces Ctrl-D en la entrada, la otra cattambién terminará.

En este caso, la única diferencia observable entre caty tail -fserá si el demonio de registro finaliza o se reinicia: catse detendrá permanentemente cuando se cierre el final de la tubería, pero tail -fcontinuará (reabrirá el archivo) cuando se reinicie el demonio.

Michael Homer
fuente
lo siento, no veo de dónde vendrá "mundo" en tu ejemplo :)
Alexander Mills
Por escribirlo.
Michael Homer
1
Y luego escribe world, y, he aquí, "mundo" aparece en la otra terminal.
Michael Homer
2

También hay una diferencia en el almacenamiento intermedio entre caty tail -f. Puedes ver esto:

Crear tubería: mkfifo pipe

Comience a leer la tubería usando caten segundo plano:cat pipe &

Abra la tubería y escríbala cada segundo: perl -MFcntl -we 'sysopen(my $fh, "pipe", O_WRONLY | O_NONBLOCK); while() {warn "written: " . syswrite($fh, "hello\n"); sleep 1}'

Ahora intente esto con en tail -f pipe &lugar de cat. Por lo tanto, puede ver que catimprime líneas tan pronto como se escriben en la tubería mediante un script perl, mientras las tail -f almacena hasta 4kb antes de imprimirlas en stdout.

Interesado en
fuente