Como posso dizer ao lsof que preciso listar apenas arquivos físicos (não soquetes, nem conexões TCP/IP, apenas arquivos físicos)?
Responder1
Acabei de dar uma olhada em algumas páginas de manual e 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. Acabei de testar 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 a arquivos com um número de descritor de arquivo.
Responder2
Pode haver uma opção, mas se você não se importa em filtrá-la através do grep, você pode fazer isso sudo lsof | egrep 'REG|DIR'
, assumindo que por "arquivos físicos" você quer dizer arquivos e diretórios regulares.
Consulte a seção OUTPUT :: TYPE da página man man lsof
para todos os tipos que podem estar nessa coluna.
Responder3
Isto é o que eu fiz e funcionou perfeitamente para mim:
lsof -F n -p 12501 | grep ^n/ | cut -c2- | sort -u
A -F n
opção lsof
fará com que ele imprima apenas onomesdos arquivos abertos. Cada linha de saída que possui o nome de um arquivo aberto começará com um único caracterenseguido imediatamente pelonome.Regularfiles sempre será o nome absoluto e totalmente qualificado do arquivo. O grep ^n/
selecionará apenas as linhas com um nome começando com a /
(ou seja, um nome de arquivo absoluto e totalmente qualificado); eliminando assim coisas como portas abertas, soquetes, tubos (como FIFOs), etc. Isso cut -c2-
eliminará o primeiro caractere, o n
, deixando apenas o nome do arquivo. Finalmente, eliminará sort -u
quaisquer entradas duplicadas.
Uma ressalva: isso incluirá arquivos que não sãoregulardesde que o nome comece com /
. Por exemplo, todos os arquivos começando com o seguinte seriam incluídos:
- /dev
- /proc
- /sys
E pode haver outros dependendo do seu sistema operacional.
Responder4
Se você usá-lo lsof /
, ele listará apenas os arquivos abertos em sistemas de arquivos montados DIRETAMENTE em / - ou seja, se você tiver /home montado em /, seu conteúdo será ignorado. Tentei várias combinações de opções para lsof, mas todas tiveram problemas. O melhor que consegui inventar é isto:
lsof `readlink -f /dev/block/*`
Isso usa readlink -f para obter todos os dispositivos de bloco e alimentá-los como uma lista para pesquisa. lsof ignora aqueles que não estão montados.
Se você tiver outras opções para limitar a pesquisa, por exemplo um pid, lembre-se de finalizar o comando lsof com um -a
to AND com a lista de dispositivos de bloco:
lsof -p 982482 -a `readlink -f /dev/block/*`