lsof -p PID vs lsof | grep PID


12

Non capisco il risultato del comando lsof.

Quando scrivo

lsof -p PID

Ottengo 4 righe e quando scrivo

lsof | grep PID

Ricevo centinaia di righe.

Non dovrebbe restituire lo stesso risultato?

Grazie per le tue risposte Ecco l'output. Sembra che sia un processo secondario o che cosa significano questi compiti?

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)

Risposte:


7

Senza vedere l'output effettivo è difficile dire esattamente cosa sta succedendo, ma immagino sia causato dal fatto che il lsof -p PIDcomando sta semplicemente stampando i file che vengono aperti dal PID specificato mentre lsof | grep PIDsta stampando tutte le righe in cui è "PID" situato in qualsiasi punto della linea. Ad esempio, se stai cercando PID = 123, la tua grepopzione stamperà anche le linee per PID 1231, 1232, 1233, ecc. Così come tutti i file che si trovano in cartelle con 123 ovunque nel loro percorso completo.

EDIT: Nel tuo esempio specifico la differenza è che lsofignora i file aperti da un thread. Se si osserva l'output grepnell'esempio, la terza colonna è "TID" o ID thread. Le linee senza TID corrispondono a quelle che stavi vedendo quando hai usato l' -popzione. Le linee con un TID (cioè le linee aperte da altri thread) sono gli extra.


In realtà, TID è indicato nelle pagine man come "Numero identificativo dell'attività", non necessariamente un ID discussione.
Miljen Mikic,

2

lsof - elenca i file aperti, prova a leggere la pagina man di lsof #man lsof

lsof -p PID elenca i file aperti associati all'ID processo del PID.

In assenza di opzioni, lsof elenca tutti i file aperti appartenenti a tutti i processi attivi. quando lo fai lsof | grep PID, elenca tutti i file aperti appartenenti a tutti i processi attivi e grep il numero PID, che può corrispondere al PID stesso e anche ovunque, dove PID appare come parte di altri PID e può essere anche il processo figlio di PID, e presto.

Pertanto, se si desidera utilizzare, lsof | grep PIDè necessario abbinare esattamente il PID, come la corrispondenza di parole complete lsof | grep -w PID, ma si otterrà comunque più righe se il PID ha altri processi figlio.


0

Ho provato questo sul mio sistema ed entrambi i comandi generano gli stessi elenchi, suggerisco di provare entrambi i comandi consecutivamente più volte, solo per assicurarsi che lo stato del processo sia stabile. Secondo la pagina man e i tuoi risultati, questa è l'unica spiegazione che posso avere.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.