lsof -p PID vs lsof | grep PID

12

Eu não entendo a saída do comando lsof.

Quando eu escrevo

lsof -p PID

Recebo 4 linhas e quando escrevo

lsof | grep PID

Eu recebo centenas de linhas.

Não deveria retornar o mesmo resultado?

Obrigado por suas respostas. Aqui estão os resultados. Parece que é subprocesso ou o que essas tarefas significam?

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
fonte

Respostas:

7

Sem ver a saída real, é difícil dizer exatamente o que está acontecendo, mas acho que isso é causado pelo fato de o lsof -p PIDcomando estar apenas imprimindo arquivos que são abertos pelo PID especificado enquanto lsof | grep PIDimprime todas as linhas em que 'PID' está localizado em qualquer lugar da linha. Por exemplo, se você estiver procurando por PID = 123, sua grepopção também imprimirá linhas para 1231, 1232, 1233 etc. do PID, bem como quaisquer arquivos localizados em pastas com 123 em qualquer lugar no caminho completo.

EDIT: No seu exemplo específico, a diferença é que lsofestá ignorando os arquivos abertos por um thread. Se você observar a saída no grepexemplo, a terceira coluna é o 'TID' ou o ID do segmento. As linhas sem um TID correspondem ao que você estava vendo quando usou a -popção. Linhas com um TID (ou seja, linhas abertas por outros threads) são os extras.

David King
fonte
Na verdade, o TID é referido nas páginas de manual como "número de identificação da tarefa", não necessariamente um ID do encadeamento.
Miljen Mikic 23/03
2

lsof - lista os arquivos abertos, tente ler a página de manual do lsof #man lsof

lsof -p PID lista arquivos abertos associados à identificação do processo do PID.

Na ausência de opções, lsof lista todos os arquivos abertos pertencentes a todos os processos ativos. ao fazê- lsof | grep PIDlo, lista todos os arquivos abertos pertencentes a todos os processos ativos e grep o número do PID, que pode corresponder ao próprio PID e também em qualquer lugar, onde o PID aparece como parte de outros PIDs e também pode ser o processo filho do PID, e em breve.

Portanto, se você deseja usar lsof | grep PID, deve corresponder exatamente ao PID, como a correspondência de palavras completas lsof | grep -w PID, mas ainda resultará em mais linhas se o PID tiver outros processos filhos.

Ijaz Ahmad Khan
fonte
0

Eu tentei isso no meu sistema e os dois comandos geram as mesmas listas. Sugiro que você tente os dois comandos consecutivamente várias vezes, apenas para garantir que o estado do processo seja estável. De acordo com a página do manual e suas saídas, esta é a única explicação que posso ter.

user148564
fonte