lsof -p PID vs lsof | grep PID

12

Nie rozumiem wyjścia polecenia lsof.

Kiedy piszę

lsof -p PID

Dostaję 4 linie i kiedy piszę

lsof | grep PID

Dostaję setki linii.

Czy nie powinien zwrócić tego samego wyniku?

Dziękuję za twoje odpowiedzi. Oto wyniki. Wygląda na to, że jest to podproces lub co oznaczają te zadania?

lsof -p 29076
COMMAND   PID  USER   FD      TYPE DEVICE SIZE/OFF NODE NAME
java    29076  pr    cwd   unknown                      /proc/29076/cwd (readlink: Permission denied)
java    29076  pr    rtd   unknown                      /proc/29076/root (readlink: Permission denied)
java    29076  pr    txt   unknown                      /proc/29076/exe (readlink: Permission denied)
java    29076  pr   NOFD                                /proc/29076/fd (opendir: Permission denied)

lsof |grep 29076|head -20
java      29076        pr  cwd   unknown                          /proc/29076/cwd (readlink: Permission denied)
java      29076        pr  rtd   unknown                          /proc/29076/root (readlink: Permission denied)
java      29076        pr  txt   unknown                          /proc/29076/exe (readlink: Permission denied)
java      29076        pr NOFD                                    /proc/29076/fd (opendir: Permission denied)
java      29076   300  pr  cwd   unknown                          /proc/29076/task/300/cwd (readlink: Permission denied)
java      29076   300  pr  rtd   unknown                          /proc/29076/task/300/root (readlink: Permission denied)
java      29076   300  pr  txt   unknown                          /proc/29076/task/300/exe (readlink: Permission denied)
java      29076   300  pr NOFD                                    /proc/29076/task/300/fd (opendir: Permission denied)
java      29076   329  pr  cwd   unknown                          /proc/29076/task/329/cwd (readlink: Permission denied)
java      29076   329  pr  rtd   unknown                          /proc/29076/task/329/root (readlink: Permission denied)
java      29076   329  pr  txt   unknown                          /proc/29076/task/329/exe (readlink: Permission denied)
java      29076   329  pr NOFD                                    /proc/29076/task/329/fd (opendir: Permission denied)
java      29076   330  pr  cwd   unknown                          /proc/29076/task/330/cwd (readlink: Permission denied)
java      29076   330  pr  rtd   unknown                          /proc/29076/task/330/root (readlink: Permission denied)
java      29076   330  pr  txt   unknown                          /proc/29076/task/330/exe (readlink: Permission denied)
java      29076   330  pr NOFD                                    /proc/29076/task/330/fd (opendir: Permission denied)
java      29076   331  pr  cwd   unknown                          /proc/29076/task/331/cwd (readlink: Permission denied)
java      29076   331  pr  rtd   unknown                          /proc/29076/task/331/root (readlink: Permission denied)
java      29076   331  pr  txt   unknown                          /proc/29076/task/331/exe (readlink: Permission denied)
java      29076   331  pr NOFD                                    /proc/29076/task/331/fd (opendir: Permission denied)
IL Mare
źródło

Odpowiedzi:

7

Trudno powiedzieć dokładnie, co się dzieje, nie widząc rzeczywistego wyniku, ale zgaduję, że jest to spowodowane tym, że lsof -p PIDpolecenie po prostu drukuje pliki, które są otwierane przez określony PID, podczas gdy lsof | grep PIDdrukuje dowolne wiersze, w których jest „PID” znajduje się w dowolnym miejscu linii. Na przykład, jeśli szukasz PID = 123, wówczas twoja grepopcja wydrukuje również wiersze dla PID 1231, 1232, 1233 itd., A także dowolne pliki, które znajdują się w folderach z 123 gdziekolwiek na całej ich ścieżce.

EDYCJA: W twoim przykładzie różnica polega na tym, że lsofignorujesz pliki otwierane przez wątek. Jeśli spojrzysz na wynik w grepprzykładzie, trzecia kolumna to „TID” lub identyfikator wątku. Linie bez identyfikatora TID pasują do tego, co widziałeś podczas korzystania z -popcji. Linie z TID (tj. Linie otwierane innymi wątkami) są dodatkami.

David King
źródło
W rzeczywistości TID jest nazywany na stronach podręcznika „numerem identyfikacyjnym zadania”, niekoniecznie identyfikatorem wątku.
Miljen Mikic
2

lsof - lista otwartych plików, spróbuj przeczytać stronę podręcznika dla lsof #man lsof

lsof -p PID wyświetla otwarte pliki powiązane z identyfikatorem procesu PID.

W przypadku braku jakichkolwiek opcji, lsof wyświetla listę wszystkich otwartych plików należących do wszystkich aktywnych procesów. kiedy to zrobisz lsof | grep PID, wyświetla listę wszystkich otwartych plików należących do wszystkich aktywnych procesów i podaje numer PID, który może pasować do samego PID, a także w dowolnym miejscu, gdzie PID pojawia się jako część innych PID i może być również procesem potomnym PID, oraz wkrótce.

Dlatego jeśli chcesz użyć lsof | grep PID, powinieneś dokładnie dopasować PID, tak jak pełne dopasowanie słów lsof | grep -w PID, ale nadal spowoduje to powstanie większej liczby wierszy, jeśli PID ma inne procesy potomne.

Ijaz Ahmad Khan
źródło
0

Próbowałem tego w moim systemie i oba polecenia generują te same listy, sugeruję, abyś wypróbował oba polecenia kolejno kilka razy, aby upewnić się, że stan procesu jest stabilny. Według strony man i twoich wyników jest to jedyne wyjaśnienie, jakie mogę mieć.

użytkownik148564
źródło