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?

dangonfast
fuente
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.

sorontar
fuente
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/*
heemayl
fuente
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
3
lsof -a -p $$

Solo red fd:

lsof -i -a -p $$
g10guang
fuente