Jaka jest różnica między `lsof -p <pid> | wc -l` i `ls / proc / <pid> / fd | wc -l`?

13

Tło: bawię się monitorowaniem ulimit pod kątem uruchamiania procesów dla konkretnego użytkownika. (Od czasu do czasu widziałem procesy, które zaczynały się z niepoprawnym limitem.) Zapytałem kilku samozwańczych guru Linuksa, a jeden zasugerował lsof -p <pid>, podczas gdy drugi zasugerował ls /proc/<pid>/fd, ale żaden nie był pozytywny, co do którego dokładniej odzwierciedla faktyczne liczenie w kierunku maksimum limit otwartych plików dla procesu.

Więc co to jest?

lsof -p <pid> | wc -l

Lub

ls /proc/<pid>/fd | wc -l

Proszę wyjaśnić różnicę. Dzięki!

Jared
źródło
3
Brzmi jak praca domowa.
ewwhite
1
Nie praca domowa. Dodano lepsze wyjaśnienie. Przeczytałem lsofstrony podręcznika i chociaż podejrzewałem, że odpowiedzią są pliki mapowane w pamięci, chciałem potwierdzenia osoby bardziej doświadczonej.
Jared

Odpowiedzi:

10

lsofda ci również pliki ISO mapowane na pamięć - co technicznie nie jest tym samym, co uchwyt pliku, nad którym aplikacja ma kontrolę. /proc/<pid>/fdjest punktem pomiarowym dla otwartych deskryptorów plików - jednak: wspomniany na stronie proc-man - jeśli główny wątek programu wielowątkowego zostanie zakończony, ten katalog będzie niedostępny.

lsof -p <pid> | grep -v mem | egrep -v '^COMMAND PID' | wc -lpokaże ci te same przedmioty, co ls /proc/<pid>/fd | wc -l.

Mapy pamięci są dostępne w /proc/<pid>/maps.

Kvisle
źródło
lsofDaje prawie taki sam wynik, ale również zawiera cwd, rtdi txtdeskryptory plików.
Ian Bamforth,
Należy również pamiętać, że liczba spacji między COMMANDi PIDmoże się różnić. Zamień spacje [[:space:]]*na bardziej ogólne.
Ian Bamforth,
Znalazłem również lsof -a -p <pid> -d ^mem -d ^cwd -d ^rtd -d ^txt -d ^DEL | wc -l tutaj , podczas gdy lsofw powłoce Androida ( adb shell) nie obsługuje -ai -d. Więc w końcu używam wersji Kvisle.
Weekend