Haz un strace
de tail -f
, lo explica todo. La parte interesante:
13791 fstat(3, {st_mode=S_IFREG|0644, st_size=139, ...}) = 0
13791 fstatfs(3, {...}) = 0
13791 inotify_init() = 4
13791 inotify_add_watch(4, "/path/to/file", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1
13791 fstat(3, {st_mode=S_IFREG|0644, st_size=139, ...}) = 0
13791 read(4, 0xd981c0, 26) = -1 EINTR (Interrupted system call)
¿Que hace? Configura un inotify
manejador al archivo, y luego espera hasta que algo suceda con este archivo. Si el kernel dice tail
a través de este controlador de inotificación, que el archivo cambió (normalmente, se agregó), luego tail
1) busca 2) lee los cambios 3) los escribe en la pantalla.
/proc/3844/fd/1
en su sistema hay un enlace simbólico a /dev/pts/14
, que es un dispositivo de caracteres. No existe tal cosa como un "mapa de memoria", al que se pueda acceder por eso. Por lo tanto, no hay nada cuyos cambios puedan firmarse en inotify, porque no hay disco o área de memoria a la que se pueda acceder.
Este dispositivo de carácter es un terminal virtual, que prácticamente funciona como si fuera un enchufe de red. Los programas que se ejecutan en este terminal virtual se conectan a este dispositivo (como si hiciera telnet en un puerto tcp) y escriben en lo que quieren escribir. También hay cosas más complejas, por ejemplo, bloquear la pantalla, secuencias de control del terminal y demás, que normalmente son manejadas por ioctl()
llamadas.
Creo que de alguna manera quieres ver una terminal virtual. Se puede hacer en Linux, pero no es tan simple, necesita alguna funcionalidad similar a la de un proxy de red y un poco de uso complicado de estos ioctl()
llamadas Pero hay herramientas que pueden hacer eso.
Actualmente no puedo recordar qué paquete de Debian tiene la herramienta para este objetivo, pero con un poco de google podrías encontrarlo fácilmente.
Extensión: como @Jajesh mencionó aquí (dale un +1 si me diste), la herramienta se llama watch
.
Extensión #2: @kelnos mencionó, un simple cat /dev/pts/14
también fueron suficientes. Lo intenté, y sí, funcionó, pero no correctamente. No experimenté mucho con eso, pero me parece que una salida que ingresa a esa terminal virtual tampoco al cat
comando, o a su ubicación original, y nunca a ambos. Pero no es seguro.
Archivos en /dev/pts
no son archivos regulares, son manejadores para terminales virtuales.A pts
el comportamiento de lectura y escritura no es simétrico (es decir, lo que está escrito allí se puede leer más tarde, como un archivo normal o un fifo/pipe), sino que está mediado por el proceso que creó la terminal virtual:algunos comunes son xterm o ssh o agetty o pantalla. El proceso de control generalmente enviará pulsaciones de teclas a procesos que leen el pts
y mostrar en pantalla lo que escriben en el pts
.
Por lo tanto, tail -f /dev/pts/14
imprimirá las teclas que toque en la terminal desde la que inició su secuencia de comandos, y si lo hace echo meh > /dev/pts/14
el meh
aparecerá un mensaje en la terminal.