lsof - restringir a saída apenas a arquivos físicos - como?

30

Como digo a lsof que preciso listar apenas arquivos físicos (não soquetes, conexões TCP / IP, apenas arquivos físicos)?

Vladislav Rastrusny
fonte
Primeiro, você precisa determinar para o que precisa. Dizer "arquivos físicos" é muito geral. lsof fornecerá arquivos que foram abertos com um descritor de arquivo. ele fornecerá arquivos que foram abertos como arquivos mapeados na memória por threads. ele fornecerá arquivos de biblioteca que foram abertos por proceses. todos esses são arquivos físicos, mas a maneira como eles estão sendo usados ​​é diferente.
Michael Martinez

Respostas:

37

Apenas olhei através de algumas páginas de manual, parece que você usa o comando:

sudo lsof /

Isso listará todos os arquivos abertos no diretório /, que é tudo em um sistema de arquivos Linux. Apenas testado e mostra apenas REG e DIR.

Mais exemplos:

lsof -a -d 0-999 -c <command name> /
lsof -a -d 0-999 -p <pid> /

0-999 limita-o a arquivos com um número de descritor de arquivo.

Dave Drager
fonte
2
Incluirá FIFOs também.
Kyle Brandt
11
Agradável e simples. Se você precisar apenas da última coluna, poderá anexar | awk {'print $ 9'} Interessante. Também não recebo fifo na minha saída. Fedora 12 e CentOS 5.3
egorgry
O CentOS 5.2 e o Ubuntu 9.04 retornam o fifo para mim, pode ser uma mudança, mas você tem certeza de que existem fifos? Gostaria de cumprimentá-lo primeiro e ter certeza de que ele está lá, do que tentar o/
Kyle Brandt
Além disso, eu estava apenas falando, parece que ele simplesmente não quer o barulho, e provavelmente não haverá muitos quinos.
precisa saber é o seguinte
4
lsof / inclui apenas arquivos no sistema de arquivos raiz. Se você tiver vários sistemas de arquivos montados, eles não aparecerão na saída. Acho que a melhor maneira é usar o grep.
James
9

Pode haver uma opção, mas se você não se importa de filtrá-la através do grep, pode fazê-lo sudo lsof | egrep 'REG|DIR', assumindo por "arquivos físicos" que você quer dizer arquivos e diretórios regulares.

Consulte a seção OUTPUT :: TYPE da página de manual man lsofpara todos os tipos que possam estar nessa coluna.

Kyle Brandt
fonte
24
Pode haver um interruptor, mas a página de manual lê como tese de doutorado de alguém ... :)
Cawflands
11
Sim ... lsof homem é extremamente difícil de ler ...; p)
Vladislav Rastrusny
Marcar esse comentário com +1. :)
egorgry
em um servidor VPN com clientes suficientes, lsof não vai voltar, por isso greping não é uma opção para mim
Ohad Cohen
@OhadCohen lsof retornará se você restringir o que está procurando. Veja "FD" na página de manual (mem, cwd, pd, etc)
Michael Martinez
2

Foi o que fiz que funcionou perfeitamente para mim:

lsof -F n -p 12501 | grep ^n/ | cut -c2- | sort -u

A -F nopção para lsoffazê-lo imprimir apenas os nomes dos arquivos abertos. Cada linha de saída que tem o nome de um arquivo aberto começará com o único caractere n seguido imediatamente pelo nome . Os arquivos regulares sempre serão o nome completo e absoluto do arquivo. O grep ^n/selecionará apenas as linhas com um nome começando com a /(significando um nome de arquivo absoluto e totalmente qualificado); eliminando coisas como portas abertas, soquetes, tubulação (como FIFOs) etc. cut -c2-Isso eliminará o primeiro caractere n, deixando apenas o nome do arquivo. Finalmente, o sort -ueliminará quaisquer entradas duplicadas.

Uma ressalva: isso incluirá arquivos que não são regulares , desde que o nome comece com a /. Por exemplo, todos os arquivos iniciados com o seguinte seriam incluídos:

  • / dev
  • / proc
  • / sys

E pode haver outros, dependendo do seu sistema operacional.

Greg Barrett
fonte