Como usar o comando lsof do Linux

Prompt de shell no Linux
Fatmawati Achmad Zaenuri / Shutterstock.com

Se tudo no Linux é um arquivo, deve haver mais do que apenas arquivos em seu disco rígido. Este tutorial mostrará como usar lsofpara ver todos os outros dispositivos e processos que estão sendo tratados como arquivos.

No Linux, tudo é um arquivo

A frase frequentemente citada de que tudo no Linux é um arquivo é meio que verdadeira. Um arquivo é uma coleção de bytes. Quando estão sendo lidos em um programa ou enviados para uma impressora, eles parecem gerar um fluxo de bytes. Quando estão sendo gravados , eles aceitam um fluxo de bytes.

Muitos outros componentes do sistema aceitam ou geram fluxos de bytes, como teclados, conexões de soquete, impressoras e processos de comunicação. Como eles aceitam, geram ou aceitam e geram fluxos de bytes, esses dispositivos podem ser manipulados – em um nível muito baixo – como se fossem arquivos.

Este conceito de design simplificou a implementação do sistema operacional Unix . Isso significava que um pequeno conjunto de manipuladores, ferramentas e APIs poderia ser criado para lidar com uma ampla gama de recursos diferentes.

Os dados e arquivos de programa que residem em seu disco rígido são arquivos de sistema de arquivos simples e antigos. Podemos usar o lscomando para listá-los e descobrir alguns detalhes sobre eles.

Como descobrimos todos os outros processos e dispositivos que estão sendo tratados como se fossem arquivos? Usamos o lsofcomando. Isso lista os arquivos abertos no sistema. Ou seja, ele lista tudo o que está sendo tratado como se fosse um arquivo.

O Comando lsof

Muitos dos processos ou dispositivos que lsofpodem relatar pertencem ao root ou foram iniciados pelo root, então você precisará usar o sudocomando com lsof.

E como essa lista será muito longa, vamos encaminhá-la less.

sudo lsof | Menos

lsof em uma janela de terminal

Antes que a lsofsaída apareça, os usuários do GNOME podem ver uma mensagem de aviso na janela do terminal.

lsof: AVISO: não é possível stat () fuse.gvfsd-fuse file system / run / user / 1000 / gvfs
As informações de saída podem estar incompletas.

lsoftenta processar todos os sistemas de arquivos montados. Esta mensagem de aviso é gerada porque lsofencontrou um sistema de arquivos virtual GNOME (GVFS). Este é um caso especial de sistema de arquivos no espaço do usuário (FUSE). Ele atua como uma ponte entre o GNOME, suas APIs e o kernel. Ninguém – nem mesmo o root – pode acessar um desses sistemas de arquivos, exceto o proprietário que o montou (neste caso, GNOME). Você pode ignorar este aviso.

A saída de lsofé muito ampla. As colunas mais à esquerda são:

Recomendado:  Como executar uma verificação de segurança no Google Chrome

as colunas mais à esquerda da saída lsof em uma janela de terminal

As colunas mais à direita são:

as colunas mais à direita da saída lsof em uma janela de terminal

The lsof Columns

Todas as colunas não se aplicam a todos os tipos de arquivos abertos. É normal que alguns deles fiquem em branco.

  • Comando : o nome do comando associado ao processo que abriu o arquivo.
  • PID : Número de identificação do processo do processo que abriu o arquivo.
  • TID : Número de identificação da tarefa (thread). Uma coluna em branco significa que não é uma tarefa; é um processo.
  • Usuário : ID de usuário ou nome do usuário a quem pertence o processo, ou ID de usuário ou login da pessoa que possui o diretório /proconde lsofencontra informações sobre o processo.
  • FD : Mostra o descritor de arquivo do arquivo. Os descritores de arquivo são descritos abaixo.
  • Tipo : tipo de nó associado ao arquivo. Os tipos de notas são descritos a seguir.
  • Dispositivo : contém os números dos dispositivos, separados por vírgulas, para um caractere especial, especial de bloco, regular, diretório ou arquivo NFS, ou um endereço de referência do kernel que identifica o arquivo. Ele também pode mostrar o endereço base ou o nome do dispositivo de um dispositivo de soquete Linux AX.25.
  • Size / Off : Mostra o tamanho do arquivo ou o deslocamento do arquivo em bytes.
  • : mostra o número do nó de um arquivo local ou o número do inode de um arquivo NFS no host do servidor ou o tipo de protocolo da Internet. Ele pode exibir STR para um fluxo ou IRQ ou número de inode de um dispositivo de soquete Linux AX.25.
  • Nome : mostra o nome do ponto de montagem e do sistema de arquivos no qual o arquivo reside.

A coluna FD

O descritor de arquivo na coluna FD pode ser uma de muitas opções; a página do manual  lista todos eles .

A entrada da coluna FD pode ser composta de três partes: um descritor de arquivo, um caractere de modo e um caractere de bloqueio. Alguns descritores de arquivo comuns são:

  • cwd : diretório de trabalho atual.
  • err : erro de informação FD (consulte a coluna NOME).
  • ltx : Texto da biblioteca compartilhada (código e dados).
  • m86 : Arquivo mapeado do DOS Merge.
  • mem : Arquivo mapeado na memória.
  • mmap : dispositivo mapeado na memória.
  • pd : Diretório pai.
  • rtd : diretório raiz.
  • txt : texto do programa (código e dados)
  • Um número que representa um descritor de arquivo.

O caractere de modo pode ser um dos seguintes:

  • r : acesso de leitura.
  • w : Acesso de gravação.
  • u : Acesso de leitura e gravação.
  • ”: Um caractere de espaço, se o modo for desconhecido e não houver caractere de bloqueio.
  • : Modo desconhecido e há um caractere de bloqueio.

O caractere de bloqueio pode ser um dos seguintes:

  • r : Lê o bloqueio em parte do arquivo.
  • R : Leia o bloqueio em todo o arquivo.
  • w : bloqueio de gravação em parte do arquivo.
  • W : bloqueio de gravação em todo o arquivo.
  • u : Ler e escrever bloqueio de qualquer comprimento.
  • U : Tipo de bloqueio desconhecido.
  • ”: Um caractere de espaço. Não feche.

A coluna TYPE

Existem mais de 70 entradas que podem aparecer na coluna TYPE. Algumas entradas comuns que você verá são:

  • REG : arquivo normal do sistema de arquivos.
  • DIR : Diretório.
  • FIFO : Primeiro a entrar, primeiro a sair.
  • CHR : Arquivo especial de personagem.
  • BLK : Bloquear arquivo especial.
  • INET : Soquete de Internet.
  • unix : socket de domínio UNIX

Veja os processos que abriram um arquivo

Para ver os processos que abriram um determinado arquivo, forneça o nome do arquivo como um parâmetro para lsof. Por exemplo, para ver os processos que abriram o kern.logarquivo, use este comando:

sudo lsof /var/log/kern.log

sudo lsof /var/log/kern.log em uma janela de terminal

lsofresponde exibindo o único processo, rsyslogdque foi iniciado pelo usuário syslog.

saída lsof em uma janela de terminal

Ver todos os arquivos abertos de um diretório

Para ver os arquivos que foram abertos de um diretório e os processos que os abriram, passe o diretório para lsofcomo um parâmetro. Você deve usar a +Dopção (diretório).

Recomendado:  Como usar o WhatsApp no ​​seu computador (e na Web)

Para ver todos os arquivos abertos no /var/log/diretório, use este comando:

sudo lsof + D / var / log /

sudo lsof + D / var / log / em uma janela de terminal

lsof responde com uma lista de todos os arquivos abertos nesse diretório.

saída lsof em uma janela de terminal

Para ver todos os arquivos que foram abertos no /homediretório, use o seguinte comando:

sudo lsof + D / home

sudo lsof + D / home em uma janela de terminal

Os arquivos que foram abertos no /homediretório são exibidos. Observe que, com descrições mais curtas em algumas das colunas, toda a lista é mais restrita.

lsof outout em uma janela de terminal

Listar arquivos abertos por um processo

Para ver os arquivos que foram abertos por um determinado processo, use a -copção (comando). Observe que você pode fornecer mais de um termo de pesquisa para lsofao mesmo tempo.

sudo lsof -c ssh -c init

sudo lsof -c ssh -c init em uma janela de terminal

lsof fornece uma lista dos arquivos que foram abertos por um dos processos fornecidos na linha de comando.

saída lsof em uma janela de terminal

Ver arquivos abertos por um usuário

Para limitar a exibição aos arquivos que foram abertos por um usuário específico, use a -uopção (usuário). Neste exemplo, veremos os arquivos que foram abertos por processos que pertencem ou foram iniciados em nome de Mary.

sudo lsof -u mary

sudo lsof -u mary em uma janela de terminal

Todos os arquivos listados foram abertos em nome da usuária Mary. Isso inclui arquivos que foram abertos pelo ambiente de área de trabalho, por exemplo, ou simplesmente como resultado do login de Mary.

saída lsof em uma janela de terminal

Excluindo arquivos abertos por um usuário

Para excluir os arquivos que foram abertos por um usuário, use o ^  operador. Excluir usuários da lista torna mais fácil encontrar as informações de seu interesse. Você deve usar a -uopção como antes e adicionar o ^caractere no início do nome do usuário.

sudo lsof + D / home -u ^ mary

sudo lsof + D / home -u ^ mary em uma janela de terminal

Desta vez, a listagem do /homediretório não inclui nenhum dos arquivos que foram abertos pela usuária Mary.

saída lsof em uma janela de terminal

Listar arquivos abertos por um processo

Para listar os arquivos que foram abertos por um processo específico, use a -popção (processo) e forneça o ID do processo como um parâmetro.

sudo lsof - p 4610

sudo lsof - p 4610 em uma janela de terminal

Todos os arquivos que foram abertos pelo ID do processo que você forneceu são listados para você.

saída lsof em uma janela de terminal

Listagem de IDs de processos que abriram um arquivo

Para ver os IDs do processo para os processos que abriram um arquivo específico, use a -topção (concisa) e forneça o nome do arquivo na linha de comando.

sudo lsof -t /usr/share/mime/mime.cache

sudo lsof -t /usr/share/mime/mice.cache em uma janela de terminal

Os IDs de processo são exibidos em uma lista simples.

saída lsof em uma janela de terminal

Use pesquisas AND e OR

Vamos listar os arquivos que foram abertos pela usuária Mary, que estão relacionados aos processos SSH. Sabemos que podemos fornecer mais de um item de pesquisa na linha de comando, então isso deve ser fácil.

sudo lsof -u mary -c ssh

sudo lsof -u mary -c ssh em uma janela de terminal

Agora vamos dar uma olhada na saída de lsof. Isso não parece certo; existem entradas na saída que foram iniciadas pelo root.

Recomendado:  Por que as pessoas gastam tanto dinheiro com MacBooks?

saída lsof em uma janela de terminal

Não era isso que esperávamos. O que aconteceu?

Quando você fornece vários termos de pesquisa, lsofserá retornado qualquer arquivo que corresponda ao primeiro termo de pesquisa ou ao segundo termo de pesquisa e assim por diante. Em outras palavras, ele realiza uma pesquisa OR.

Para fazer lsofuma busca AND, use a -aopção (e). Isso significa que os únicos arquivos que serão listados serão aqueles que correspondem ao primeiro termo de pesquisa e ao segundo termo de pesquisa e assim por diante.

Vamos tentar novamente e usar a -aopção.

sudo lsof -u mary -c ssh -a

sudo lsof -u mary -c ssh -a em uma janela de terminal

Agora, todos os arquivos da lista foram abertos por ou em nome de Maria e estão associados ao comando SSH.

saída lsof em uma janela de terminal

Atualizando a tela automaticamente

Podemos usar a +|-ropção (repetir) para colocar lsofem modo de repetição. A opção de repetição pode ser aplicada de duas maneiras, +rou -r. Devemos também adicionar o número de segundos que queremos lsofesperar antes de atualizar a exibição.

Usar a opção de repetição em qualquer um dos formatos lsofexibe os resultados normalmente, mas adiciona uma linha tracejada na parte inferior da tela. Ele aguarda o número de segundos fornecido na linha de comando e, em seguida, atualiza a exibição com um novo conjunto de resultados.

Com a -ropção, isso continuará até que você pressione Ctrl + C. Com o +rformato, ele continuará até que não haja resultados a serem exibidos ou até que você pressione Ctrl + C.

sudo lsof -u mary -c ssh -a -r5

sudo lsof -u mary -c ssh -a -r5 em uma janela de terminal

Observe a linha tracejada na parte inferior da lista. Isso separa cada nova exibição de dados quando a saída é atualizada.

saída lsof em uma janela de terminal

Exibindo arquivos associados a conexões de Internet

A -i opção (internet) permite que você veja os arquivos abertos por processos associados a conexões de rede e internet.

lsof -i

lsof -i em uma janela de terminal

Todos os arquivos abertos por conexões de rede e internet são exibidos.

saída lsof em uma janela de terminal

Exibindo arquivos associados a conexões de Internet por ID de processo

Para ver os arquivos abertos por conexões de Internet que estão associados a um ID de processo específico, adicione a -popção e a -aopção.

Procuramos aqui os ficheiros abertos por uma ligação à Internet ou rede, por um processo com um ID 606.

sudo lsof -i -a -p 606

lsof -i em uma janela de terminal

Todos os arquivos abertos pelo processo ID 606 que estão associados a conexões de internet ou rede são exibidos.

saída lsof em uma janela de terminal

Exibindo arquivos associados a conexões e comandos da Internet

Podemos usar a -copção (comando) para procurar arquivos abertos por processos específicos. Para procurar arquivos que foram abertos pela Internet ou conexões de rede associadas ao  sshprocesso, use o seguinte comando:

lsof -i -a -c ssh

lsof -i -a -c ssh em uma janela de terminal

Todos os arquivos abertos devido aos processos ssh são listados na saída.

saída lsof em uma janela de terminal

Exibindo arquivos associados a conexões e portas da Internet

Podemos fazer lsofrelatório sobre os arquivos que foram abertos por conexões de internet ou rede em uma porta específica. Para fazer isso, usamos o :caractere seguido pelo número da porta.

Aqui, estamos pedindo lsofpara listar os arquivos que foram abertos por conexões de rede ou Internet usando a porta 22.

lsof -i: 22

lsof -i: 22 em uma janela de terminal

Todos os arquivos listados foram abertos por processos associados à porta 22 (que é a porta padrão para conexões SSH).

saída lsof em uma janela de terminal

Exibindo arquivos associados a conexões e protocolos de Internet

Podemos pedir lsofpara mostrar os arquivos que foram abertos por processos associados a conexões de rede e internet, que estão usando um protocolo específico. Podemos escolher entre TCP, UDP e SMTP. Vamos usar o protocolo TCP e ver o que temos.

sudo lsof -i tcp

sudo lsof -i tcp em uma janela de terminal

Os únicos arquivos listados são aqueles abertos por processos que estão usando o protocolo TCP.

saída lsof em uma janela de terminal

Nós apenas arranhamos a superfície

Essa é uma boa base para alguns casos de uso comuns  lsof, mas há muito mais do que isso. O quanto mais pode ser julgado pelo fato de a página de manual ter mais de 2.800 linhas.

O lsofcomando pode ser usado para se aprofundar ainda mais nos estratos de arquivos abertos e pseudo-arquivos. Fornecemos um mapa de esboço; o atlas está na página do manual .