Cómo enumerar los descriptores de archivos abiertos (y los archivos a los que hacen referencia) en mi sesión de bash actual


23

Estoy corriendo en una sesión bash interactiva. He creado algunos descriptores de archivos, usando exec, y me gustaría enumerar cuál es el estado actual de mi sesión bash.

¿Hay alguna manera de enumerar los descriptores de archivo abiertos actualmente?


1
mira este enlace
Kamaraj

@ Kamaraj gracias. Entonces bash no tiene incorporado para hacer eso? ¿Necesito usar funciones específicas de Linux?
dangonfast

bashno es parte del núcleo, por lo que no puede saber qué están haciendo otros procesos, incluso aquellos que comenzó.
Julie Pelletier

@JuliePelletier: pero los procesos secundarios no cambian los descriptores de archivo del proceso principal, ¿verdad?
dangonfast

Respuestas:


27

Sí, esto enumerará todos los descriptores de archivos abiertos:

$ ls -la /proc/$$/fd
total 0
dr-x------ 2 sorontar sorontar  0 Dec 28 00:56 .
dr-xr-xr-x 9 sorontar sorontar  0 Dec 28 00:56 ..
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 0 -> /dev/pts/6
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 1 -> /dev/pts/6
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 2 -> /dev/pts/6
lrwx------ 1 sorontar sorontar 64 Dec 28 00:56 255 -> /dev/pts/6
l-wx------ 1 sorontar sorontar 64 Dec 28 00:56 4 -> /home/sorontar/testfile.txt

Por supuesto, como siempre: 0 es stdin, 1 es stdout y 2 es stderr.
El cuarto es un archivo abierto (para escribir) en este caso.


Eso solo enumera el proceso actual, no sus hijos o padres.
Julie Pelletier

@JuliePelletier El título de la pregunta dice 'mi sesión de bash actual'. ¿Estoy entendiendo eso mal?
sorontar

@JuliePelletier: ¿por qué estaría interesado en los descriptores de archivo utilizados por los niños o los padres de mi sesión de bash actual? Solo estoy interesado en los descriptores de archivo que usa mi sesión de bash actual.
dangonfast

@delavnog: Bien entonces. Si eso responde a su pregunta, debe marcarla como tal.
Julie Pelletier

4

Suponiendo que desea enumerar los descriptores de archivo que están conectados a cualquier terminal, puede usar lsof/ fusero similar como:

$ lsof -p $$ 2>/dev/null | awk '$NF ~ /\/pts\//'
bash    32406 foobar    0u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    1u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    2u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar    3u   CHR 136,31      0t0      34 /dev/pts/31
bash    32406 foobar  255u   CHR 136,31      0t0      34 /dev/pts/31

Estas herramientas básicamente analizan /proc, por lo que también puede acceder, /proc/$$/fd/por ejemplo:

ls /proc/$$/fd/*

2
La selección de \/pts\/rechazos abre archivos comoexec 4>testfile.txt
sorontar

@sorontar Sí, como dije, este es solo para enumerar los que están conectados a cualquier terminal.
heemayl

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.