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.