Jak wyświetlić listę otwartych deskryptorów plików (i plików, do których się odnoszą) w mojej bieżącej sesji bash

23

Korzystam z interaktywnej sesji bash. Utworzyłem niektóre deskryptory plików przy użyciu exec i chciałbym wymienić aktualny stan mojej sesji bash.

Czy istnieje sposób na wyświetlenie listy obecnie otwartych deskryptorów plików?

Dangonfast
źródło
1
sprawdź ten link
Kamaraj,
@Kamaraj dzięki. Więc bash nie ma wbudowanego do tego celu? Potrzebuję użyć funkcji specyficznych dla systemu Linux?
dangonfast
bashnie jest częścią jądra, więc nie może wiedzieć, co robią inne procesy, nawet te, które uruchomił.
Julie Pelletier,
@JuliePelletier: ale procesy potomne nie zmieniają deskryptorów plików procesu macierzystego, prawda?
dangonfast

Odpowiedzi:

27

Tak, wyświetli się lista wszystkich otwartych deskryptorów plików:

$ 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

Oczywiście, jak zwykle: 0 to stdin, 1 to stdout, a 2 to stderr.
Czwarty to otwarty plik (do zapisu) w tym przypadku.

sorontar
źródło
To tylko wyświetla bieżący proces, a nie jego dzieci lub rodziców.
Julie Pelletier,
@JuliePelletier Tytuł pytania brzmi „moja obecna sesja bash”. Czy rozumiem to źle?
sorontar
@JuliePelletier: dlaczego miałbym być zainteresowany deskryptorami plików używanymi przez dzieci lub rodzica mojej bieżącej sesji bash? Interesuje mnie tylko deskryptory plików używane w mojej bieżącej sesji bash.
dangonfast
@delavnog: Dobrze więc. Jeśli to odpowiada na twoje pytanie, powinieneś je oznaczyć jako takie.
Julie Pelletier,
4

Zakładając, że chcesz wyświetlić listę deskryptorów plików podłączonych do dowolnego terminala, możesz użyć lsof/ fuserlub podobnych, takich jak:

$ 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

Te narzędzia są w zasadzie parsowane /proc, więc możesz uzyskać do nich dostęp /proc/$$/fd/np .:

ls /proc/$$/fd/*
heemayl
źródło
2
Wybór \/pts\/odrzuca otwarte pliki, takie jakexec 4>testfile.txt
sorontar
@sorontar Tak, tak jak powiedziałem, ten służy wyłącznie do wyświetlania list dołączonych do dowolnego terminala.
heemayl
3
lsof -a -p $$

Tylko sieć fd:

lsof -i -a -p $$
g10guang
źródło