He configurado rsyslog
para registrar ciertos eventos de registro en /dev/xconsole
:
*.*;cron.!=info;mail.!=info |/dev/xconsole
/dev/xconsole
es una canalización con nombre (fifo
). Si quiero ver lo que se está registrando, puedo hacer cat /dev/xconsole
. Me sorprende ver que el comando cat /dev/xconsole
no 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?
Respuesta aceptada:
cat
sigue leyendo hasta que obtiene EOF. Una tubería produce EOF en la salida solo cuando obtiene EOF en la entrada. El demonio de registro está abriendo el archivo, escribiendo en él, y manteniéndolo abierto - al igual que lo hace con un archivo normal - por lo que EOF nunca se genera en la salida. cat
simplemente sigue leyendo, bloqueándose cada vez que agota lo que está actualmente en la tubería.
Puedes probar esto tú mismo manualmente:
$ mkfifo test
$ cat test
Y en otra terminal:
$ cat > test
hello
Habrá salida en el otro terminal. Entonces:
world
Habrá más salida en el otro terminal. Si ahora presiona Ctrl-D en la entrada, entonces el otro cat
terminará también.
En este caso, la única diferencia observable entre cat
y tail -f
será si el demonio de registro se termina o se reinicia:cat
se detendrá permanentemente cuando se cierre el extremo de escritura de la canalización, pero tail -f
continuará (reapertura del archivo) cuando se reinicie el daemon.