Comment lister les descripteurs de fichiers ouverts (et les fichiers auxquels ils se réfèrent) dans ma session bash actuelle

23

Je cours dans une session bash interactive. J'ai créé des descripteurs de fichiers, en utilisant exec, et je voudrais lister quel est l'état actuel de ma session bash.

Existe-t-il un moyen de répertorier les descripteurs de fichiers actuellement ouverts?

dangonfast
la source
1
vérifier ce lien
Kamaraj
@Kamaraj merci. Donc bash n'a pas de fonction intégrée pour le faire? J'ai besoin d'utiliser des fonctionnalités spécifiques à Linux?
dangonfast
bashne fait pas partie du noyau, il ne peut donc pas savoir ce que font les autres processus, même ceux qu'il a démarrés.
Julie Pelletier
@JuliePelletier: mais les processus enfants ne modifient pas les descripteurs de fichiers du processus parent, n'est-ce pas?
dangonfast

Réponses:

27

Oui, cela répertoriera tous les descripteurs de fichiers ouverts:

$ 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

Bien sûr, comme d'habitude: 0 est stdin, 1 est stdout et 2 est stderr.
Le 4ème est un fichier ouvert (à écrire) dans ce cas.

Sorontar
la source
Cela répertorie simplement le processus actuel, pas ses enfants ou ses parents.
Julie Pelletier
@JuliePelletier Le titre de la question dit "ma session bash actuelle". Est-ce que je comprends mal?
sorontar
@JuliePelletier: pourquoi serais-je intéressé par les descripteurs de fichiers utilisés par les enfants ou le parent de ma session bash actuelle? Je suis uniquement intéressé par les descripteurs de fichiers utilisés par ma session bash actuelle.
dangonfast
@delavnog: Bon alors. Si cela répond à votre question, vous devez la marquer comme telle.
Julie Pelletier
4

En supposant que vous souhaitiez répertorier les descripteurs de fichiers attachés à n'importe quel terminal, vous pouvez utiliser lsof/ fuserou similaire comme:

$ 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

Ces outils analysent essentiellement /proc, de sorte que vous pouvez /proc/$$/fd/également y accéder, par exemple:

ls /proc/$$/fd/*
heemayl
la source
2
La sélection des \/pts\/rejets ouverts commeexec 4>testfile.txt
sorontar
@sorontar Oui, comme je l'ai dit, celui-ci ne sert qu'à répertorier ceux attachés à n'importe quel terminal.
heemayl
3
lsof -a -p $$

Réseau fd uniquement:

lsof -i -a -p $$
g10guang
la source