GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué no puedo `tail -f /proc/$pid/fd/1`?

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.


Linux
  1. ¿Por qué la impresión en la salida estándar es tan lenta? ¿Se puede acelerar?

  2. /proc/[pid]/pagemaps y /proc/[pid]/maps | linux

  3. ¿Cómo puedo detener un proceso de Symfony que está escuchando en http://127.0.0.1:8000?

  4. ¿Cuándo debo usar /dev/shm/ y cuándo debo usar /tmp/?

  5. ¿Por qué hay tantos /dev/tty en Linux?

Linux:¿cómo leer desde /proc/$pid/mem en Linux?

Linux – ¿Número de enlace /proc/pid/fd/x?

Archivos /proc/cpuinfo y /proc/meminfo en Linux

Comprender los archivos /proc/mounts, /etc/mtab y /proc/partitions

¿Por qué los directorios /home, /usr, /var, etc. tienen todos el mismo número de inodo (2)?

¿Por qué se requieren < o > para usar /dev/tcp?