So listen Sie die geöffneten Dateideskriptoren (und die Dateien, auf die sie verweisen) in meiner aktuellen Bash-Sitzung auf

22

Ich nehme an einer interaktiven Bash-Sitzung teil. Ich habe mit exec einige Dateideskriptoren erstellt und möchte den aktuellen Status meiner Bash-Sitzung auflisten.

Gibt es eine Möglichkeit, die aktuell geöffneten Dateideskriptoren aufzulisten?

dangonfast
quelle
1
Überprüfen Sie diesen Link
Kamaraj
@Kamaraj danke. Bash hat also keinen eingebauten, um das zu tun? Muss ich linuxspezifische Funktionen verwenden?
Dangonfast
bashist nicht Teil des Kernels, daher kann er nicht wissen, was andere Prozesse tun, selbst die, die er gestartet hat.
Julie Pelletier
@ JuliePelletier: Aber untergeordnete Prozesse ändern nicht die Dateideskriptoren des übergeordneten Prozesses, oder?
Dangonfast

Antworten:

27

Ja, dies listet alle offenen Dateideskriptoren auf:

$ 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

Natürlich, wie immer: 0 ist stdin, 1 ist stdout und 2 ist stderr.
Die vierte ist in diesem Fall eine offene Datei (zum Schreiben).

Sorontar
quelle
Das listet nur den aktuellen Prozess auf, nicht seine Kinder oder Eltern.
Julie Pelletier
@ JuliePelletier Der Fragentitel sagt "meine aktuelle Bash-Sitzung". Verstehe ich das falsch?
Sorontar
@ JuliePelletier: Warum interessiere ich mich für die Dateideskriptoren, die von den Kindern oder den Eltern meiner aktuellen Bash-Sitzung verwendet werden? Ich interessiere mich nur für die Dateideskriptoren, die von meiner aktuellen Bash-Sitzung verwendet werden.
Dangonfast
@ delavnog: Gut dann. Wenn dies Ihre Frage beantwortet, sollten Sie sie als solche markieren.
Julie Pelletier
4

Vorausgesetzt , dass Sie die Datei - Deskriptoren auflisten möchten, die an jedem Terminal angeschlossen sind, können Sie lsof/ fuseroder ähnlich wie:

$ 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

Diese Tools werden grundsätzlich analysiert /proc, sodass Sie auch auf Folgendes zugreifen können /proc/$$/fd/:

ls /proc/$$/fd/*
heemayl
quelle
2
Die Auswahl von \/pts\/Ablehnungen offenen Dateien wieexec 4>testfile.txt
Sorontar
@sorontar Yep, wie ich schon sagte, dient nur dazu, diejenigen aufzulisten, die an ein Terminal angeschlossen sind.
Heemayl
3
lsof -a -p $$

Netzwerk fd nur:

lsof -i -a -p $$
g10guang
quelle