Comando lsof – Listar Arquivos e Processos abertos
lsof significa “listar arquivos abertos” (List Open Files), e é um comando usado para retornar uma listagem de todos os arquivos abertos e dos processos que os abriram.
Um arquivo aberto pode ser um arquivo de disco, diretório, biblioteca, pipes, dispositivos e sockets de rede que tenham sido abertos por um processo qualquer.
Por exemplo, podemos usar esse comando quando tentamos desmontar um disco e não conseguimos, pois algum arquivo, que desconhecemos, está em uso ainda. Como resolver o problema? Podemos listar os arquivos abertos e identificar os processos que os estão usando, e então, finalizá-los.
Essa ferramenta está disponível nos sistemas Linux, FreeBSD, Solaris e Mac OS X, entre outros.
Sintaxe:
lsof [opções]
Opções comuns:
lsof <enter>
Lista todos os arquivos abertos por todos os processos.
+D diretório
Procura todas as instâncias abertas do diretório listado e todos os arquivos e diretórios que ele contém
-i
Mostra uma lista de sockets de rede abertos
-i :n
Mostra as conexões abertas na porta n
-i [tcp|udp]
Mostra as conexões ativas usando TCP ou UDP
-u usuário
Mostra o que o usuário tem aberto
-p PID
Mostra os arquivos abertos pelo processo com PID especificado
-t
Retorna apenas os identificadores do processos (somente PIDs)
-c comando
Mostra quais arquivos e conexões de rede um comando está usando
Informações comumente retornadas pelo lsof são:
- COMMAND – Comando em execução
- PID – Identificador do processo
- USER – Usuário proprietário do processo
- FD – File Descriptor (Descritor de Arquivos). Os mais comuns são:
- cwd – Diretório atual
- txt – Arquivo de texto
- mem – Arquivo mapeado na memória
- mmap – dispositivo mapeado na memória
- NUMBER – É o próprio descritor de arquivos. O caractere que vem logo após o número representa o modo no qual o arquivo está aberto, odendo ser: r para leitura, w para gravação e u para leitura e gravação.
- TYPE – Tipo do arquivo. Os tipos mais comuns são:
- REG – Arquivo regular
- DIR – Diretório
- FIFO – FIFO (First In First Out)
- CHR – Arquivo especial de caracteres
- DEVICE – Números do dispositivo, separados por vírgula
- SIZE, SIZE/OFF, OFFSET – Tamanho do arquivo ou offset do arquivo em bytes
- NODE – Número de inode no sistema de arquivos ou tipo de protocolo IP
- NAME – Nome do ponto de montagem e sistema de arquivos no qual o arquivo reside, ou o nome de um disopsitivo especial de blocos ou caracteres, ou ainda os endereços IP de um arquivo de rede; há outras opções mais avançadas.
Consulte a página de manual lsof(8) para ver mais detalhes.
Exemplos:
1. Mostrar os processos ativos no diretório /acesso. Usamos o comando lsof sem opções, e filtramos o resultado com grep:
# lsof | grep /acesso
Veja que temos um arquivo chamado planilhas aberto com o programa vi. O PID do processo é 2312, trata-se de um arquivo regular (REG) e o arquivo está aberto para eitura e gravação (3u).
2. Listar todas as conexões ativas que usem o protocolo UDP:
# lsof -i UDP
3. Mostrar as conexões abertas na porta 931:
# lsof -i:931
4. Mostrar o que o usuário fabio possui aberto no sistema:
# lsof -u fabio
5. Mostrar quais arquivos e conexões de rede o comando ping usa após ser disparado por um usuário:
# lsof -c ping
6. Procura todas as instâncias abertas do diretório /root:
# lsof +D /root
7. Obter o tráfego IPv6 na máquina:
# lsof -i 6
8. Descobrir portas que estão aguardando conexões (LISTEN):
# lsof -i -s TCP:LISTEN
Funciona usando o grep também, como em lsof -i | grep LISTEN
9. Mostrar os arquivos abertos por todos os usuários EXCETO o usuário fabio. para isso usaremos o caractere ^ (expressão regular):
# lsof -u ^fabio
10. Matar todos os processos pertencentes ao usuário fabio de uma só vez:
# kill -9 $(lsof -t -u fabio)
Esse comando executa lsof com as opções -u (usuário) e -t (retorna apenas PIDs), e passa o resultado para o comando kill -9.
Há várias outras opções disponíveis para o comando lsof. Pesquise nas páginas de manual se quiser saber mais a respeito.