Jak wyświetlić otwarte deskryptory plików, ale nie używając polecenia lsof

48

Cześć. Przeczytałem tutaj, że lsof nie jest dokładnym sposobem uzyskania liczby otwartych deskryptorów plików. Zamiast tego zalecił użycie tego polecenia

 cat /proc/sys/fs/file-nr

Chociaż to polecenie wyświetla liczbę FD, w jaki sposób wyświetlasz listę otwartych deskryptorów plików, które to polecenie właśnie policzyło?

dimas
źródło
4
Prawdopodobnie chcesz wiedzieć, czy Twoja ulimit została przekroczona, prawda? Napisałem o tym na blogu pod linuxintro.org/wiki/Is_my_ulimit_exceeded ; co najważniejsze, ulimit jest ograniczeniem dla poszczególnych procesów, które można znaleźć pod / proc / PID / limitami i zamiast lsof użyłbym ls / proc / PID / fd do wyświetlenia deskryptorów plików procesu.
Thorsten Staerk

Odpowiedzi:

60

Istnieją dwa powody, dla lsof | wc -lktórych nie liczą się deskryptory plików. Jednym z nich jest to, że zawiera listę rzeczy, które nie są otwartymi plikami, takich jak ładowane dynamicznie połączone biblioteki i bieżące katalogi robocze; musisz je odfiltrować. Innym jest to, że lsofjego uruchomienie zajmuje trochę czasu, więc można pominąć pliki, które są otwierane lub zamykane podczas działania; dlatego liczba wymienionych otwartych plików jest przybliżona. Patrzenie na /proc/sys/fs/file-nrdaje dokładną wartość w danym momencie.

cat /proc/sys/fs/file-nrprzydaje się tylko wtedy, gdy potrzebujesz dokładnej liczby, głównie w celu sprawdzenia wyczerpania zasobów. Jeśli chcesz wyświetlić listę otwartych plików, musisz zadzwonić lsoflub użyć innej równoważnej metody, takiej jak /proc/*/fdręczne trałowanie .

Gilles „SO- przestań być zły”
źródło
1
Cześć dzięki za dobre wytłumaczenie Gilles. Próbowałem ls / proc / * / fd i dostałem wszystkie otwarte fd w tym czasie. Daje to wynik z kodowaniem kolorami, po prostu zajrzę do instrukcji.
dimas
Katalogi @dimas /proc/*/fdzawierają dowiązania symboliczne do otwartych plików. Do kontroli wizualnej użyj ls -l. W przypadku zautomatyzowanego leczenia użyj readlinkdo wyodrębnienia docelowego łącza.
Gilles „SO- przestań być zły”
Wystarczy użyć ls -l, ale eksperymentuję z readlink. Próbowałem innych / proc / PID / map i innych opcji określonych tutaj kernel.org/doc/man-pages/online/pages/man5/proc.5.html . Jeszcze raz dziękuję za dodatkowe informacje.
dimas
1
/ proc / sys / fs / file-nr daje mi 3872 (i dwie inne liczby). Jak może to być liczba plików, które mam otwarte, jeśli ulimit -n pokazuje mi 1024?
Thorsten Staerk
1
@ThorstenStaerk Wszystkie ustawienia setrlimit(wywołanie systemowe leżące u podstaw ulimitpolecenia powłoki) dotyczą poszczególnych procesów. Wpływają one tylko na proces, który wykonuje połączenie (i pośrednio na procesy, które później wywołuje).
Gilles „SO- przestań być zły”
25

Informacje o procesie są dynamicznie przechowywane przez system w katalogach w katalogu / proc. Na przykład proces z PID 1234 będzie miał katalog o nazwie / proc / 1234.

Jest tam sporo informacji, ale teraz interesuje Cię podkatalog / proc / 1234 / fd .

UWAGA: Musisz mieć uprawnienia administratora, aby przeglądać lub otwierać pliki dla procesów, których nie jesteś właścicielem, a także dla procesów SetUID.

Przykład:

root@johan-HP-ProBook-6560b-LG654EA-ACQ:/proc# ls -l 2443/fd
total 0
lr-x------ 1 johan johan 64 Feb 27 10:26 0 -> pipe:[13637]
l-wx------ 1 johan johan 64 Feb 27 10:26 1 -> /home/johan/.xsession-errors
lrwx------ 1 johan johan 64 Feb 27 10:26 10 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 11 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 12 -> socket:[39495]
lrwx------ 1 johan johan 64 Feb 27 10:26 13 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 14 -> anon_inode:inotify
lrwx------ 1 johan johan 64 Feb 27 10:26 15 -> anon_inode:[eventfd]
l-wx------ 1 johan johan 64 Feb 27 10:26 16 -> pipe:[37885]
lr-x------ 1 johan johan 64 Feb 27 10:26 17 -> pipe:[37886]
l-wx------ 1 johan johan 64 Feb 27 10:26 2 -> /home/johan/.xsession-errors
l-wx------ 1 johan johan 64 Feb 27 10:26 21 -> pipe:[167984]
lr-x------ 1 johan johan 64 Feb 27 10:26 22 -> pipe:[167985]
l-wx------ 1 johan johan 64 Feb 27 10:26 23 -> pipe:[170009]
lr-x------ 1 johan johan 64 Feb 27 10:26 24 -> pipe:[170010]
lrwx------ 1 johan johan 64 Feb 27 10:26 3 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 4 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 5 -> socket:[14721]
l-wx------ 1 johan johan 64 Feb 27 10:26 6 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 7 -> socket:[14730]
lrwx------ 1 johan johan 64 Feb 27 10:26 8 -> socket:[13984]
lrwx------ 1 johan johan 64 Feb 27 10:26 9 -> socket:[14767]

root@johan-HP:/proc# cat 2443/fdinfo/2
pos:    1244446
flags:  0102001

Zobacz także pozostałe pliki w katalogu / proc ... znajduje się tutaj wiele przydatnych informacji z systemu.

Johan
źródło