lsof -p PID vs lsof | grep PID

9

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

Quando escrevo

lsof -p PID

Eu recebo 4 linhas e quando escrevo

lsof | grep PID

Eu recebo centenas de linhas.

Não deveria retornar o mesmo resultado?

Obrigado pelas suas respostas. Aqui estão a saída. 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)
    
por IL Mare 29.12.2015 / 13:55

4 respostas

7

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

EDITAR: Em seu exemplo específico, a diferença é que lsof está ignorando arquivos abertos por um encadeamento. Se você observar a saída no exemplo grep , a terceira coluna será o 'TID' ou o ID do thread. As linhas sem um TID correspondem ao que você estava vendo quando usou a opção -p . Linhas com um TID (ou seja, linhas abertas por outros tópicos) são os extras.

    
por 29.12.2015 / 14:20
1

lsof - lista de arquivos abertos, tente ler a man page para lsof #man lsof

lsof -p PID lista arquivos abertos associados ao ID do processo do PID.

Na falta de opções, o lsof lista todos os arquivos abertos pertencentes a todos os processos ativos. quando você faz lsof | grep PID , ele lista todos os arquivos abertos pertencentes a todos os processos ativos eo número PID, que pode corresponder ao próprio PID e também em qualquer lugar, onde PID aparece como parte de outros PIDs e pode ser o processo filho de PID bem, e assim por diante.

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

    
por 29.12.2015 / 14:29
0

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

    
por 29.12.2015 / 15:39
0

Algumas versões do lsof incluem um id de thread. Isso pode ser determinado pelo cabeçalho da coluna TID aparente na saída. Tal saída dará origem a uma duplicação de entradas, já que o lsof provavelmente mostrará entradas duplicadas uma para cada thread.

link

    
por 25.10.2016 / 14:35

Tags